Экранирование пробелов в тире [дубликат]

Después de establecer la conexión serial, debe ejecutar resizeen esa sesión. (Además, vuelva a llamar a resizedespués de cada cambio de geometría.)

Este comando detecta automáticamente la geometría correcta del terminal y notifica al shell al respecto.

En Fedora, el comando está empaquetado como xterm-resizepero no depende de X11.

1
13.04.2019, 01:42
2 ответа
set -- cat "a b"

"$@"

Это запустит catс одним аргументом a b. Расширение "$@"(, включая двойные кавычки! )будет списком индивидуально цитируемых позиционных параметров. Позиционные параметры устанавливаются с помощью set.

Однако включение имени команды в сам список является редкостью. Было бы чаще видеть

set -- "a b"

cat "$@"

или, если вы хотите сохранить фактическую переменную имени команды,

cmd=cat
set -- "a b"

"$cmd" "$@"

Если вы в -между установкой операндов имени файла и запуском команды хотите добавить в команду больше имен файлов или параметров, просто измените$@:

cmd=cat
set -- "a b"

# later (adding more files to the end):
set -- "$@" "more files" "some glob here-"[0-9]

# later (adding an option at the front):
set -- -v "$@"

"$cmd" "$@"

Обратите внимание, что будет сложно добавить в начало $@, если имя команды уже есть. В этом случае вам придется временно shiftимя команды отключить от $@в отдельную переменную, добавить то, что вы хотите добавить, а затем снова добавить имя команды:

cmd=$1
shift
set -- "$cmd" -v "$@"

Обычно мы хотим использовать set --, а не просто set, чтобы установить позиционные параметры. --запрещает синтаксическому анализатору параметров командной строки обнаруживать параметры командной строки после этой точки в списке аргументов командной строки. Обратите внимание, что без --было бы невозможно добавить строку -vперед $@с set, поскольку set -vделает что-то совсем другое.

Связанные:

2
27.01.2020, 23:22

Когда вы используете 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
1
27.01.2020, 23:22

Теги

Похожие вопросы