Почему эта команда не работает как псевдоним?

Почему эта команда не работает как псевдоним?

Я использовал следующую команду для вывода списка десяти самых больших файлов на любой глубине в текущем каталоге:

find -type f -size +10M -exec ls -gGsSh1 {} + | awk 'NR<=10 {print $0}'

(Я использую awkвместо , headчтобы предотвратитьошибка сломанной трубыкогда список слишком длинный)

Работает хорошо, но, очевидно, его трудно запомнить и набирать каждый раз. Я пробовал вставить это в .bash_aliases, но тогда это не работает (выводит 10 пустых строк).

Если я использую lessвместо awk, вывод будет представлен правильно, но это означает отображение всего списка файлов размером более 10 МБ (мой нижний порог), отсортированного по размеру, а не только самых больших.

Итак, что делает awkchoke частью псевдонима команды здесь (предполагая, что проблема действительно в этом) и что я могу сделать, чтобы это исправить?

решение1

При использовании этой команды в качестве псевдонима $0больше не защищен одинарными кавычками, поэтому преобразуется в имя вашей оболочки. Эти команды это демонстрируют:

$ alias F="echo '$0'"      
$ F
bash

Имя оболочки (предположительно bash) случайно не установленоawkимя переменной, приводящее к пустым строкам.

Одним из способов защиты $0от расширения оболочки может быть использование чего-то вроде:

alias F="find -type f -size +1k -exec ls -gGsSh1 {} + | awk 'NR<=10 {print \$0}'"

Однако, поскольку это $0бесполезно, вы можете просто удалить это из awkзаявления.

find -type f -size +10M -exec ls -gGsSh1 {} + | awk 'NR<=10 {print}'

Вы можете пойти дальше и удалить весь блок, так как печать выбранной строки awkв любом случае является поведением по умолчанию:

find -type f -size +10M -exec ls -gGsSh1 {} + | awk 'NR<=10'

В качестве альтернативы вы можете просто продолжить использование headи сбросить сообщение об ошибке:

find -type f -size +10M -exec ls -gGsSh1 {} + 2>&1 | head

Связанный контент