Может быть, использовать scp
, который используется для передачи файлов?
Для регистрации вывода команды (с ошибками):
command >> log 2>&1
И чтобы получить журнал на свой компьютер (, выполните его внеssh
):
scp user@server:/path/to/log
Надеюсь, это поможет.
Программа (скрипт, приложение, что угодно )не может видеть командную строку, которая его вызвала. Он получает нулевой ряд дополнительных параметров, анализируемых вызывающей оболочкой.
Например, когда вы запускаете 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)
Этот тип разделения не имеет ничего общего с IFS.
Это самый простой вид разбиения, который преобразует строку в слова.
Слова — это отдельные лексемы, над которыми может действовать оболочка. Подобно чтению предложения, сначала нужно разделить его на слова, а затем понять, что они означают.
Единственный способ избежать такого разделения — цитирование. Это основная причина изобретения цитирования.
$ op.sh () { printf '%s\n' "$@"; }
$ op.sh one two three
one
two
three
$ op.sh "one two three"
one two three
В этом больше нет волшебства.