我使用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 ...想知道为什么最后一个别名会覆盖以前的别名......
答案 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