Посмотрите, как работает синтаксический анализ и цитирование команд 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