Проблема в том, что pipe (|
) - это "мета" команда, выполняемая оболочкой, и она соединяет две разные команды. Так ls -1 | tail -1
выполняет две команды (ls
и tail
) и использует shell-конструкцию (|
) для соединения с двумя.
(поэтому ваш заголовок a command inside a variable неверен, так как ваша проблема на самом деле multiple commands inside a single variable)
В любом случае, решением является разбор/исполнение вашей команды с помощью shell:
f="ls -1 | tail -1"
sh -c "${f}"
В качестве альтернативы можно также использовать eval
, который работает без создания нового процесса shell:
f="ls -1 | tail -1"
eval "${f}"