Использовать не eval
!
Поместите его в массив и раскройте все слова с двойными кавычками "${arr[@]}"
до not , чтобы IFS
разделил слова из-за
cmdArgs=()
cmdArgs=('date' '+%H:%M:%S')
и посмотреть содержимое массива внутри. declare -p
позволяет видеть содержимое массива внутри с каждым параметром команды в отдельных индексах. Если один из таких аргументов содержит пробелы, цитирование внутри при добавлении в массив предотвратит его разделение из-за разделения Word.
declare -p cmdArgs
declare -a cmdArgs='([0]="date" [1]="+%H:%M:%S")'
и выполните команды как
"${cmdArgs[@]}"
23:15:18
(или) вообще используют функцию bash
для запуска команды
cmd() {
date '+%H:%M:%S'
}
и вызывают функцию как только
cmd
POSIX sh
не имеет массивов, поэтому ближе всего вы можете создать список элементов в позиционных параметрах. Вот способ POSIX sh
для запуска почтовой программы
# POSIX sh
# Usage: sendto subject address [address ...]
sendto() {
subject=$1
shift
first=1
for addr; do
if [ "$first" = 1 ]; then set --; first=0; fi
set -- "$@" --recipient="$addr"
done
if [ "$first" = 1 ]; then
echo "usage: sendto subject address [address ...]"
return 1
fi
MailTool --subject="$subject" "$@"
}