仅当在“/”中: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
}

上面的 shell 函数将测试当前目录,并根据测试结果以不同的方式/执行 GNU命令。ls

"$@"将被原始命令行上的命令行选项和操作数替换。

我们需要使用command ls而不是仅仅ls在函数中来绕过 shell 函数查找ls(否则这会给我们一个很好的无限递归)。

请注意,这将不是如果从其他地方做,请使用忽略模式ls /,并且它将要如果执行例如ls /home/dvoofrom /,则使用忽略模式。

为了更容易记住它实际上做了什么(六个月后当你想知道它在做什么时),请使用长选项:

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。

相关内容