GNU ls от Coreutils отсутствует реализация OS X ACL

Я использую brew для извлечения и установки общих версий терминальных команд и утилит GNU с помощью brew install coreutils.
Затем в моем .bash_profile я включаю их PATH с помощью

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

пока все хорошо, я могу использовать версию coreutils GNU.
Проблема исходит от 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) alias ls=/bin/ls # из 1-го условия ls_flag == true
2) alias ls='ls -G' # из 2-го условия "if ls --color" (ложь)

НО, если я подскажу, ls -@ все равно выдаст ошибку, говорящую мне, что я все еще использую GNU ls... интересно, почему последний псевдоним переопределит предыдущие...


person Leonardo    schedule 27.10.2014    source источник
comment
Почему бы вам просто не удалить (или переименовать, или chmod -x) coreutils' ls?   -  person gniourf_gniourf    schedule 27.10.2014
comment
Другая возможность состоит в том, чтобы связать команды coreutils, которые вы хотите использовать (следовательно, не ls), в вашем /usr/local/bin (или другом каталоге, который может быть более подходящим для OSX), убедившись, что этот каталог отображается перед /bin в вашей переменной PATH.   -  person gniourf_gniourf    schedule 27.10.2014
comment
@gniourf_gniourf Я хочу использовать все команды (кроме ls) из coreutils, именно это и сделает PATH="$(brew --prefix coreutils)/libexec/gnubin:$PATH". Вручную связывать их все, но ls не кажется хорошим решением. Допустим, есть 100 команд, вместо удаления единственной 1, которая мне не нужна, вы предлагаете связать 99, которые мне нужны... много работы   -  person Leonardo    schedule 27.10.2014
comment
Тогда как насчет моего другого предложения? т. е. переименовать/удалить/chmod -x ls из coreutils?   -  person gniourf_gniourf    schedule 27.10.2014
comment
Кстати, связать все, кроме одного, довольно просто: свяжите их все и удалите ссылку для тех, которые вам не нужны.   -  person gniourf_gniourf    schedule 27.10.2014


Ответы (2)


Это не правильно

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

Вам не хватает $ для $ls_flag, а -eq используется для числового сравнения внутри [[ ... ]]

Поскольку "true" и "false" являются командами, вы хотите написать

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

или, короче

$ls_flag && alias ls=/bin/ls
person glenn jackman    schedule 27.10.2014
comment
вы правы, мои познания в bash-скриптах смущают - person Leonardo; 27.10.2014

Вы можете создать псевдоним:

alias ls=/bin/ls
person trojanfoe    schedule 27.10.2014
comment
это не сработает. Во-первых, потому что это должно быть alias ls=/bin/ls, но даже исправляя это, если я which ls получаю /usr/local/opt/coreutils/libexec/gnubin/ls - person Leonardo; 27.10.2014
comment
И если вы наберете ls, что произойдет? Использование which не имеет смысла. - person trojanfoe; 27.10.2014
comment
если я наберу ls -@, я получу ошибку, показывающую, что я все еще использую GNU ls. Но если я сделаю псевдоним в локальной оболочке, то это сработает. Проблема возникает из-за определения псевдонима в файле bash_profile. Разве нет простого способа указать экспортировать PATH, кроме команды ls? - person Leonardo; 27.10.2014
comment
Это единственный способ, который я могу придумать. - person trojanfoe; 27.10.2014
comment
хорошо, проблема связана с другим псевдонимом, который я делаю с ls, я обновлю вопрос - person Leonardo; 27.10.2014