我在我的输出中~/.bashrc隐藏了以下内容:testls
alias ls='ls -I test'
Run Code Online (Sandbox Code Playgroud)
但我希望它只test在我当前的工作目录是根 ( /) 文件夹时隐藏,如果我在其他文件夹中,则不会隐藏。
我怎样才能做到这一点?
Kus*_*nda 34
ls () {
case "$PWD" in
/) command ls -I test "$@" ;;
*) command ls "$@" ;;
esac
}
Run Code Online (Sandbox Code Playgroud)
上述 shell 函数将根据测试结果测试当前目录/并以ls不同方式执行 GNU命令。
"$@" 将被原始命令行上的命令行选项和操作数替换。
我们需要使用command ls而不是仅仅ls在函数中使用来绕过 shell 函数查找ls(否则会给我们一个很好的无限递归)。
请注意,这将无法使用,如果这样做的忽略模式ls /从别的地方,而且它会使用忽略模式,如果这样做,例如,ls /home/dvoo从/。
为了更容易记住它实际上做了什么(当你想知道它在做什么时,六个月后),使用长选项:
ls () {
case "$PWD" in
/) command ls --ignore='test' "$@" ;;
*) command ls "$@" ;;
esac
}
Run Code Online (Sandbox Code Playgroud)
上述函数的另一种实现,只会ls从一个地方调用(并且更短):
ls () {
[ "$PWD" = "/" ] && set -- --ignore='test' "$@"
command ls "$@"
}
Run Code Online (Sandbox Code Playgroud)
mur*_*uru 22
如果你是使用功能测试/为ls:
ls () {
if [[ "$PWD" == / ]]
then
command ls -I test "$@"
else
command ls "$@"
fi
}
Run Code Online (Sandbox Code Playgroud)
这样,您传递给的任何参数ls仍将被使用。
或者:
ls () {
if [ "$PWD" == / ]
then
set -- -I test "$@"
fi
command ls "$@"
}
Run Code Online (Sandbox Code Playgroud)
Geo*_*iou 10
像这样的事情我认为它会起作用:
alias ls='[[ "$PWD" = "/" ]] && ls -I test ||ls'
Run Code Online (Sandbox Code Playgroud)
$PWD是当前工作目录
&&是否有要执行的操作,如果 pwd 是/(条件检查 =true)
||如果 pwd 不是/ (条件检查 = 假) 有要执行的操作
但经过仔细测试上述解决方案无法正常工作。
另一方面,这将可以作为功能的替代品:
alias ls='{ [[ "$PWD" == "/" ]] && a="-I tmp2" ||a=""; };ls $a '
Run Code Online (Sandbox Code Playgroud)
或者甚至更好,类似于其他答案,但不需要功能:
alias lstest='{ [[ "$PWD" == "/" ]] && set -- "-I" "tmp2" || set --; }; ls "$@"'
Run Code Online (Sandbox Code Playgroud)
调用此别名时在命令行中给出的可能的额外标志和/或完整路径被保留并发送到 ls。