Как отключить разделение аргументов bash?

Может быть, использовать scp, который используется для передачи файлов?

Для регистрации вывода команды (с ошибками):

command >> log 2>&1

И чтобы получить журнал на свой компьютер (, выполните его внеssh):

scp user@server:/path/to/log

Надеюсь, это поможет.

0
07.05.2021, 03:06
2 ответа

Программа (скрипт, приложение, что угодно )не может видеть командную строку, которая его вызвала. Он получает нулевой ряд дополнительных параметров, анализируемых вызывающей оболочкой.

Например, когда вы запускаете ls f*, не lsобрабатывает f*, а оболочка. Если у вас есть три файла, начинающиеся с f, то ls f*может быть проанализировано оболочкой, чтобы стать ls final food fred, и именно это будет выполнено. В этой ситуации lsвидит эти три аргумента, а неf*

Точно так же, когда вы выполняете ./op.sh one two three, оболочка анализирует это как ./op.shи три аргумента, разделенных пробелом -, one, twoи three. Пробел отбрасывается как часть синтаксического анализа. Вы можете увидеть это с помощью скрипта, подобного этому

#!/bin/bash
for a in $*; do echo "Found * argument ($a)"; done
echo
for a in "$@"; do echo "Found @ argument ($a)"; done
echo
echo "All together, they are ($*)"

Если он называется args, вы можете сделать его исполняемым (chmod a+x args), а затем вызывать его следующим образом

./args one two   three

Соответствующий выход

Found * argument (one)
Found * argument (two)
Found * argument (three)

Found @ argument (one)
Found @ argument (two)
Found @ argument (three)

All together, they are (one two three)

Если вы поэкспериментируете с этим, то заметите, что $*представляет аргументы командной строки, каждый из которых разделен одним пробелом, а также внутренние пробелы разделены еще раз. Обычно это бесполезно . Вместо этого используйте -в двойных кавычках "$@", что дополнительно защищает от непреднамеренного разбора аргументов. Однако в любом случае аргументы восстанавливаются из проанализированных аргументов и не являются копией исходной командной строки.

Чтобы сохранить пробелы, вы должны заключить строку в кавычки. Двойные кавычки позволяют раскрывать переменные и конструкции $(...). Одинарные кавычки оставляют вас с литералом. Здесь я использую одинарные кавычки

Пробел в кавычках

./args 'one two   three'
Found * argument (one)
Found * argument (two)
Found * argument (three)

Found @ argument (one two   three)

All together, they are (one two   three)

Одинарные кавычки

'one more $HOME to go'
Found * argument (one)
Found * argument (more)
Found * argument ($HOME)
Found * argument (to)
Found * argument (go)

Found @ argument (one more $HOME to go)

All together, they are (one more $HOME to go)

Двойные кавычки

./args "one more $HOME to go"
Found * argument (one)
Found * argument (more)
Found * argument (/home/roaima)
Found * argument (to)
Found * argument (go)

Found @ argument (one more /home/roaima to go)

All together, they are (one more /home/roaima to go)
1
28.07.2021, 11:34

Этот тип разделения не имеет ничего общего с IFS.

Это самый простой вид разбиения, который преобразует строку в слова.

Слова — это отдельные лексемы, над которыми может действовать оболочка. Подобно чтению предложения, сначала нужно разделить его на слова, а затем понять, что они означают.

Единственный способ избежать такого разделения — цитирование. Это основная причина изобретения цитирования.

$ op.sh () { printf '%s\n' "$@"; }

$ op.sh one two three
one
two
three

$ op.sh "one two three"
one two three

В этом больше нет волшебства.

1
28.07.2021, 11:34

Теги

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