"/" 内にある場合のみ: alias ls='ls -I test'?

"/" 内にある場合のみ: alias ls='ls -I test'?

~/.bashrc出力からリストを非表示にするには、次のものがあります。testls

alias ls='ls -I test'

testただし、現在の作業ディレクトリがルート(/)フォルダの場合にのみ非表示になり、他のフォルダにあるときは非表示にしたいです。

この目標をどのように達成できますか?

答え1

ls () {
  case "$PWD" in
    /) command ls -I test "$@" ;;
    *) command ls "$@" ;;
  esac
}

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

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

シェル関数の検索をバイパスするには、関数内でcommand ls代わりに使用する必要があります(そうでない場合は、素晴らしい無限再帰が提供されます)。lsls

になります。いいえ他の場所で実行する場合は、無視モードを使用してくださいls /〜するls /home/dvooたとえば、次から実行すると、/無視モードが使用されます。

実際に何をしたか覚えやすいようにするには(6ヶ月後に何をしたのか疑問に思う)、長いオプションを使用してください。

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

ls上記の関数の別の実装は、ある場所(またはより短い場所)でのみ呼び出されます。

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

答え2

/関数を使用して、次の点に該当するかどうかをテストしますls

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

これにより、渡されたすべてのパラメータが引き続きls使用されます。

または:

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

答え3

私の考えには、次のようなことがうまくいくようです。

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

$PWDpwdが現在の作業ディレクトリの
&&場合/(条件確認= true)、
||pwdでない場合/ (条件確認= false)操作を実行します。

ただし、慎重にテストした結果、上記の回避策は正しく機能しません。

一方、これは関数を置き換えて使用できます。

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

または他の答えと似ていますが、機能がない方が良いです。

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

このエイリアスが呼び出されると、コマンドラインで提供される可能性のある追加のフラグおよび/またはフルパスが保存され、lsに送信されます。

関連情報