Я хочу заполнить переменную строкой команды, считанной из файла, и выполнить ее. Никаких проблем, когда это одна команда. Когда я использую |, это не работает. Есть ли помощь??? Спасибо
$ f="ls -1"
$ $f
a
a0
a1
a2
a3
b1
cfg
cfile
dfile
e
fcorreo.txt
log
logs
work
$ f="ls -1 | tail -1"
$ $f
ls: cannot access |: No such file or directory
ls: cannot access tail: No such file or directory
$ f='ls -1 | tail -1'
$ $f
ls: cannot access |: No such file or directory
ls: cannot access tail: No such file or directory
$ echo $f
ls -1 | tail -1
решение1
Проблема в том, что конвейер ( |
) — это "мета"-команда, запускаемая оболочкой, и она соединяет две разные команды. Так же, как и ls -1 | tail -1
запуск двух команд ( ls
и tail
) и использование конструкции оболочки ( |
) для соединения с двумя. (так что ваш заголовокакоманда внутри переменнойневерно, так как ваша проблема на самом деленесколькокоманды внутриодинокийпеременная)
В любом случае, решение — проанализировать/выполнить вашу команду с помощью оболочки:
f="ls -1 | tail -1"
sh -c "${f}"
В качестве альтернативы вы также можете использовать eval
, что работает без создания нового процесса оболочки:
f="ls -1 | tail -1"
eval "${f}"
решение2
Вы можете использовать функцию, как показано ниже;
f() { ls -1 | tail -1; }
Например;
user@host $ f() { ls -1 | tail -1; }
user@host $ f
test.txt