awk в bash с ls и переменной

Я хотел напечатать только имя файлов определенного каталога: так это работает:

ls -g  --sort=size -r /bin | awk '{print $8,$9,$10,$11,$12,$13}'

но если я прочитаю переменную пути, это не сработает:

read PATH
ls -g  --sort=size -r $(PATH) | awk '{print $8,$9,$10,$11,$12,$13}'
Command 'awk' is available in '/usr/bin/awk'

person rodi    schedule 18.12.2014    source источник


Ответы (2)


Должен быть:

ls -g  --sort=size -r ${PATH} | awk '{print $8,$9,$10,$11,$12,$13}'

Обратите внимание на фигурные скобки.

С $(..) он выполнит команду/функцию с именем PATH и заменит результат, который вам не нужен.

Обратите внимание, что PATH — плохой выбор для имени переменной, так как оно перезапишет системную переменную с тем же именем и сделает системные команды недоступными (поскольку исходное PATH теперь отсутствует). Я предлагаю вам использовать другое имя, например my_path:

read my_path
ls -g  --sort=size -r ${my_path} | awk '{print $8,$9,$10,$11,$12,$13}'
person P.P    schedule 18.12.2014

Именно поэтому вам не следует использовать UPPER_CASE_VARS. $PATH — это переменная, используемая оболочкой для поиска исполняемые файлы в вашей системе. Как только вы перезапишете его пользовательским вводом, ваш сценарий больше не сможет найти ничего, что не находится в том, что было введено. В этом случае вы ввели /bin, поэтому ваш скрипт может найти /bin/ls, но awk там нет.

command_not_found_handle (см. /etc/bash.bashrc) вмешался, чтобы дать вам предложение.

person glenn jackman    schedule 18.12.2014