Coreutils的GNU ls缺少OS X ACL实现

时间:2014-10-27 10:48:53

标签: macos bash homebrew ls gnu-coreutils

我使用brew检索并安装brew install coreutils的终端命令和工具的常见GNU版本。
然后在我的.bash_profile中,包括他们的PATH和

if [  -d $(brew --prefix coreutils)/libexec/gnubin  ]; then
    PATH="$(brew --prefix coreutils)/libexec/gnubin:$PATH"
fi
到目前为止,我可以使用GNU版本的coreutils 问题来自ls。 Apple实现ACL未在GNU ls上实现。我发现这一点是多次敲打我的头而不理解为什么(例如)ls -le@会给我错误ls: invalid option -- 'e'

所以现在我明白了GNU ls就是问题所在。

问题
我怎样才能获得所有coreutils但ls? 我想使用Apple版本的ls,但继续使用其余的coreutils。如何修改我的.bash_profile

编辑:

如果我创建一个标记以了解我当前是否正在使用coretuils,那么我将创建一个别名:

ls_flag=false
if [[  $(brew) &&  -d  $(brew --prefix coreutils)/libexec/gnubin  ]]; then
    PATH="$(brew --prefix coreutils)/libexec/gnubin:$PATH"
    ls_flag=true
fi

export PATH

if [[ ls_flag -eq true ]]; then
   alias ls=/bin/ls
fi

如果我在这里停止.bash_profile,这将有效。但是,下列条件会产生另一个问题。我用它们来理解我是否使用GNU ls或Apple ls并选择了正确的选项来为ls命令着色:

# Detect which `ls` flavour is in use
if ls --color > /dev/null 2>&1; then # GNU `ls`
    alias ls='ls --color=always'
    # load my color scheme (it only works with GNU ls)
    # dircolors only work with coreutils
    eval `dircolors  ~/.dotfiles/data/dircolors`
else # OS X `ls`
    alias ls='ls -G'
fi

所以,在这一点上ls应该是:
1)别名ls = / bin / ls#来自第一个条件ls_flag == true
2)别名ls =' ls -G' #来自第二个条件"如果ls --color" (假)

但如果我提示ls -@仍然会抛出一个错误,告诉我我仍在使用GNU ls ...想知道为什么最后一个别名会覆盖以前的别名......

2 个答案:

答案 0 :(得分:2)

这是错误的

if [[ ls_flag -eq true ]]; then
   alias ls=/bin/ls
fi

您错过了$的{​​{1}},而$ls_flag内的-eq用于[[ ... ]]

由于“true”和“false”是命令,因此您需要编写

if $ls_flag; then
   alias ls=/bin/ls
fi

或更简洁

$ls_flag && alias ls=/bin/ls

答案 1 :(得分:1)

您可以创建别名:

alias ls=/bin/ls