Когда вы используете echo $cmd
или $cmd
без кавычек, split+glob вызывается для содержимого $cmd
. Это не имеет ничего общего с тем, что происходит, когда вы выполняете echo cat a b
, где интерпретация синтаксиса оболочки разделяет cat
, a
и b
на разные аргументы для перехода к echo
.
Разделенная часть команды split+glob выполняется на основе содержимого $IFS
, которое по умолчанию содержит SPC, поэтому слова, полученные в результате этого разделения, никогда не могут содержать SPC. Вам нужно будет использовать другой разделитель:
IFS=: # split on :
set -o noglob # disable glob part
cmd='cat:a b'
printf '<%s>\n' $cmd # split+glob
$cmd # split+glob
В качестве альтернативы, вместо того, чтобы полагаться на split+glob, вы могли бы cmd
содержать код командной строки оболочки (на языке оболочки )и вызывать eval
для интерпретации этого кода:
cmd='cat "a b"'
eval "$cmd" # note the quotes to disable split+glob
kill -stop %2 && kill %1
Пример:
$ sleep 100 &
[1] 2284
$ sleep 200 &
[2] 2325
$ sleep 300 &
[3] 2366
$ jobs
[1] Running sleep 100 &
[2]- Running sleep 200 &
[3]+ Running sleep 300 &
$ kill -stop %2 && kill %1
[1] Terminated sleep 100
[2]+ Stopped sleep 200
$ jobs
[2]+ Stopped sleep 200
[3]- Running sleep 300 &