Macos Coreutils缺少OS X ACL实现的GNU ls
我正在使用Macos Coreutils缺少OS X ACL实现的GNU ls,macos,bash,homebrew,ls,gnu-coreutils,Macos,Bash,Homebrew,Ls,Gnu Coreutils,我正在使用brew检索和安装通用GNU版本的终端命令和UTIL,并使用brew安装coreutils 然后在我的.bash_配置文件中,我包含了它们的路径 if [ -d $(brew --prefix coreutils)/libexec/gnubin ]; then PATH="$(brew --prefix coreutils)/libexec/gnubin:$PATH" fi 到目前为止还不错,我可以使用coreutils的GNU版本。 问题来自ls。未在GNUls上实现的
brew
检索和安装通用GNU版本的终端命令和UTIL,并使用brew安装coreutils
然后在我的.bash_配置文件中,我包含了它们的路径
if [ -d $(brew --prefix coreutils)/libexec/gnubin ]; then
PATH="$(brew --prefix coreutils)/libexec/gnubin:$PATH"
fi
到目前为止还不错,我可以使用coreutils的GNU版本。问题来自
ls
。未在GNUls
上实现的苹果工具。我发现这一点是因为我多次撞击头部,不明白为什么(例如)ls-le@
会给我错误ls:invalid选项--“e”
所以现在我明白了GNULS是个问题
问题:除了
ls
,我怎样才能找到所有coreutils的来源?
我想使用苹果版的ls
,但继续使用其余的coreutils。通过修改我的.bash\u配置文件
,如何实现这一点
编辑:
如果我创建一个标志以了解我当前是否在使用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
alias ls=/bin/ls
如果我在这里停止我的.bash\u配置文件
,这将起作用。但另一个问题来自以下条件。我使用它们来了解我使用的是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#u标志==true
2) 别名ls='ls-G'#来自第二个条件“if ls--color”(false)
但是如果我提示
ls-@
仍然会抛出一个错误,告诉我我仍在使用GNU ls…不知道为什么最后一个别名会覆盖以前的别名…您可以创建一个别名:
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
alias ls=/bin/ls
这是错误的
if [[ ls_flag -eq true ]]; then
alias ls=/bin/ls
fi
您缺少$ls\u标志的$
,并且-eq
用于[…]]
因为“true”和“false”是命令,所以您需要编写
if $ls_flag; then
alias ls=/bin/ls
fi
或者,更简洁地说
$ls_flag && alias ls=/bin/ls
这行不通。首先是因为它应该是别名ls=/bin/ls
,但是如果我我得到的是哪个ls
/usr/local/opt/coreutils/libexec/gnubin/ls,那么如果你键入ls
会发生什么?使用哪个
是无关紧要的。如果我键入ls-@
我会得到一个错误,显示我仍在使用GNU ls。但是如果我在本地shell中使用别名,那么它就会工作。问题来自于在bash_概要文件中定义别名。除了ls命令外,是否有一种明确的方法来告诉导出路径?这是我唯一能想到的方法。好的,问题来自我对ls使用的其他别名,我将更新问题:为什么不删除(或重命名,或chmod-x
)coreutils'ls
?另一种可能性是链接您想要使用的coreutils命令(因此不是ls
)在/usr/local/bin
(或者在OSX上更合适的另一个目录)中,确保此目录出现在/bin
在路径变量中的/PATH
之前。@gniourf\u gniourf我想使用coreutils中的所有命令(但不是ls),这就是路径=“$(brew--前缀coreutils)/libexec/gnubin:$PATH“
可以。手动链接所有命令,但ls似乎不是一个好的解决方案。假设有100个命令,而不是删除我不需要的唯一一个。你建议链接我需要的99个。要做很多工作,那么我的其他建议如何?例如,从coreutils重命名/remove/chmod-x
ls
?顺便说一句,链接除o之外的所有命令ne相当简单:将它们全部链接起来,然后删除你不想要的链接。你是对的,我的bash脚本知识令人尴尬