Создать псевдоним из stdout - PullRequest
       11

Создать псевдоним из stdout

0 голосов
/ 26 октября 2018

Я пытаюсь динамически создать псевдоним 'из вывода другого инструмента командной строки.

Например:

> MyScript
blender="/opt/apps/blender/blender/2.79/blender"
someOtherAlias="ls -l"

Я пытаюсь следующий код:

MyScript | {
   while IFS= read -r line;
   do
      `echo alias $line`;
   done;
}

Но когда я запускаю это, я получаю следующую ошибку:

bash: alias: -l": not found

Просто попытка запустить эту команду сама выдает мне ту же ошибку:

> `echo 'alias someOtherAlias="ls -l"'`
bash: alias: -l": not found

Но, очевидно, работает следующая команда:

alias someOtherAlias="ls -l"

Я пытался найти кого-то еще, кто мог сделать это раньше, но ни один из моих поисков ничего не дал.

Буду признателен за любую помощь. Спасибо!

1 Ответ

0 голосов
/ 26 октября 2018

Посмотрите, как работает синтаксический анализ и цитирование команд bash (и posix shells), и посмотрите разницу между синтаксисом и буквальным аргументом: например, '.."..' "..'.." - это литеральные кавычки в аргументе, тогда как " или ' - синтаксис оболочкии также не являются частью аргумента

, поэтому включение таски с помощью set -x может помочь понять:

set -x
`echo 'alias someOtherAlias="ls -l"'`
++ echo 'alias someOtherAlias="ls -l"'
+ alias 'someOtherAlias="ls' '-l"'
bash: alias: -l": not found

bash видит 3 слова: alias, someOtherAlias="ls и -l",и псевдоним зацикливается на своих аргументах, если они содержат =, он создает псевдоним, в противном случае он показывает, какой аргумент псевдонима, так как -l" не является псевдонимом, он показывает ошибку.запустить в подоболочке (можно увидеть с помощью mutiple + в трассировке), это не повлияет на текущую оболочку.

eval может использоваться для переосмысления литерала как синтаксиса bash (или для повторного анализа строки).

Таким образом, следующее должно работать, но будьте осторожны, используя eval для произвольных аргументов (из пользовательского ввода), можете выполнить произвольную команду.

eval 'alias someOtherAlias="ls -l"'

Наконец, также как команды bash после запуска pipeв скорлупе.

while IFS= read -r line;
do
    `echo alias $line`;
done <MyScript
...