web-dev-qa-db-ja.com

「/」の場合のみ:エイリアスls = 'ls -I test'?

testの出力からlsのリストを非表示にするために、~/.bashrcに以下を含めます。

alias ls='ls -I test'

しかし、現在の作業ディレクトリがルート(/)フォルダーである場合にのみtestを非表示にし、他のフォルダーにいる場合は非表示にしないようにします。

どうすればこれを達成できますか?

6
user218642

このようなものはうまくいくと思いました:

alias ls='[[ "$PWD" = "/" ]] && ls -I test ||ls'

$PWDは現在の作業ディレクトリです
&&には、pwdが/の場合に実行するアクションがあります(条件チェック= true)
||には、pwdが/でない場合に実行するアクションがあります(条件チェック= false)

しかし、上記のソリューションを注意深くテストした後IS正しく機能していません。

一方、これは関数の代わりとして問題なく動作します:

alias ls='{ [[ "$PWD" == "/" ]] && a="-I tmp2" ||a=""; };ls $a '

または、他の回答と同様ですが、機能は必要ありません。

alias lstest='{ [[ "$PWD" == "/" ]] && set -- "-I" "tmp2" || set --; }; ls "$@"'

このエイリアスを呼び出すときにコマンドラインで指定される可能性のある追加のフラグまたはフルパス、あるいはその両方が保持され、lsに送信されます。

10
George Vasiliou
_ls () {
  case "$PWD" in
    /) command ls -I test "$@" ;;
    *) command ls "$@" ;;
  esac
}
_

上記のシェル関数は、現在のディレクトリを_/_に対してテストし、テストの結果に応じてGNU lsコマンドを異なる方法で実行します。

_"$@"_は、元のコマンドラインのコマンドラインオプションとオペランドに置き換えられます。

lsのシェル関数ルックアップをバイパスするには、関数でlsだけでなく_command ls_を使用する必要があります(そうしないと、Nice無限再帰が発生します)。

これはnot他の場所から_ls /_を行う場合は無視パターンを使用し、()を実行する場合は無視パターンを使用することに注意してください(例:_ls /home/dvoo/_からの__。

これが実際に何をしているのかを覚えやすくするために(何をしているのかと思うと、6か月後)、長いオプションを使用します。

_ls () {
  case "$PWD" in
    /) command ls --ignore='test' "$@" ;;
    *) command ls "$@" ;;
  esac
}
_

1つの場所からlsのみを呼び出す上記の関数の代替実装(およびより短い):

_ls () {
  [ "$PWD" = "/" ] && set -- --ignore='test' "$@"
  command ls "$@"
}
_
34
Kusalananda

ls/にいるかどうかをテストする関数を使用します。

ls () {
    if [[ "$PWD" == / ]]
    then
        command ls -I test "$@"
    else
        command ls "$@"
    fi
}

これにより、lsに渡した引数は引き続き使用されます。

または:

ls () {
    if [ "$PWD" == / ]
    then
        set -- -I test "$@"
    fi
    command ls "$@"
}
22
muru