仅当在“/”中时:别名 ls='ls -I test'?

7 ls bash alias

我在我的输出中~/.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)

  • 这是一种在函数中只调用一次 `ls` 的好方法! (3认同)

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。

  • 这样做的一个问题是,使用 `/` 中的 `ls` _总是_ 导致列出当前目录 (`/`),无论命令行说什么。 (7认同)
  • “不需要功能”并不是真正的加分项。这两个“更正”函数都不必要地覆盖了可能正在使用的全局变量。 (3认同)