test
の出力からls
のリストを非表示にするために、~/.bashrc
に以下を含めます。
alias ls='ls -I test'
しかし、現在の作業ディレクトリがルート(/
)フォルダーである場合にのみtest
を非表示にし、他のフォルダーにいる場合は非表示にしないようにします。
どうすればこれを達成できますか?
このようなものはうまくいくと思いました:
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に送信されます。
_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 "$@"
}
_
ls
が/
にいるかどうかをテストする関数を使用します。
ls () {
if [[ "$PWD" == / ]]
then
command ls -I test "$@"
else
command ls "$@"
fi
}
これにより、ls
に渡した引数は引き続き使用されます。
または:
ls () {
if [ "$PWD" == / ]
then
set -- -I test "$@"
fi
command ls "$@"
}