Опция --group-directoryies-first для команды «ls»

13

Я использую Ubuntu 16.04 и OS X.

alias ll='ls -Flh --group-directories-first'

Это псевдоним в моем bashrc, но каким-то образом --group-directories-firstопция стала незаконной в OS X после того, как я обновил bash с помощью Homebrew. На моем рабочем столе Ubuntu я все еще могу использовать эту опцию.

В какой версии Bash опция не поддерживается? Версия Bash в моей машине OS X говоритGNU bash, Version 4.4.12(1)-release (x86_64-apple-darwin15.6.0)

Я хотел бы использовать --group-directories-firstопцию снова. Есть ли способ добиться этого?

IzumiSy
источник
1
Вы используете GNU correutils lsили MacOS ls? Ты пробовал другой?
bmike

Ответы:

12

Установить coreutilsс Homebrew и псевдоним , llчтобы gls -Flh --group-directories-firstвместо этого.

  • brew install coreutils устанавливает GNU Coreutils , если он не установлен.
  • Используйте alias ll='gls -Flh --group-directories-first'в .bashrc.
    (Если вы хотите использовать один и тот же .bashrcфайл в обеих операционных системах, см. Ниже.)

В Ubuntu lsпредоставляется GNU Coreutils , который всегда есть в Ubuntu. Вот почему lsподдерживает --group-directories-firstв Ubuntu. Возможно, вы использовали версию GNU Coreutils для lsMacOS и раньше, которую также устанавливает Homebrew, glsно которую можно использовать lsнесколькими способами.

lsэто внешняя команда, а не встроенная команда Bash. Использование другой версии или сборки Bash не должно влиять на это. Я не уверен, что случилось, когда вы обновили Bash с помощью Homebrew. Может быть, больше, чем Bash тоже был улучшен; возможно у вас былаlsфункция оболочки или псевдоним, определенный в глобальном файле конфигурации, который был заменен; может быть, у вас была символическая ссылка,lsкоторая указалаglsи была перезаписана; может быть, у вас все еще есть что-то подобное, но ваш$PATHизменился. Что бы ни случилось, GNU Coreutils lsподдерживает--group-directories-first , и переключение на него (как я полагаю, bmike предлагает ) должно решить вашу проблему.

Если по какой-то причине вы хотите использовать один и тот же .bashrcфайл в обеих системах, есть несколько возможных подходов. Вы можете создать символическую ссылку, скрипт-обертку, функцию оболочки или (поскольку расширение псевдонима Bash нерекурсивно) псевдоним для glsвашей системы Ubuntu. Но я предлагаю вместо этого проверить, какая ОС используется в .bashrc. Несмотря на то, что вы получите разные llпсевдонимы, определенные в каждой системе, этот подход имеет преимущество самодокументирования. Ваш .bashrcбудет иметь смысл для вас через год или месяц.

if [ "$OSTYPE" == linux-gnu ]; then  # Is this the Ubuntu system?
    alias ll='ls -Flh --group-directories-first'
else
    alias ll='gls -Flh --group-directories-first'
fi

Или, если вы обнаружите, что обычно предпочитаете запускать Coreutils ls, даже если вы не используете llпсевдоним, вы можете создать lsпсевдоним для gls:

if [ "$OSTYPE" != linux-gnu ]; then  # Is this the macOS system?
    alias ls=gls
fi

alias ll='ls -Flh --group-directories-first'

(Спасибо большое soroushjp за обнаружение ошибки в более ранней версии этого скрипта.)

Элия ​​Каган
источник
Я последовал этому ответу и использую: alias ls = 'gls --color -h --group-directoryies-first' alias ll = 'ls -al'
user2875289
1
Я думаю, что в вашем последнем разделе «Или, если вы обнаружите, что обычно предпочитаете запускать…» , условное выражение необходимо изменить на:, "$OSTYPE" != linux-gnu так как вы хотите присвоить псевдониму ls значение gls, если вы не находитесь в системе Linux GNU (например, ты на маке).
soroushjp
1
@soroushjp Спасибо - ты прав. (Я исправил это; извините за ожидание!)
Элия ​​Каган