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