Эффективное использование разрыва строки в сценарии оболочки

Я полагаю, что вы используете wayland, если вы запустите среду рабочего стола с помощью Xorg, тогда gpick должен работать.

У меня была та же проблема в gnome, переход на Gnome с Xorg перед входом в систему заставил gpick снова работать.

0
28.02.2019, 12:13
2 ответа

Да, заканчивайте строки знаком \для продолжения на следующей строке.

ssh user@server << EOF
  command_one
  command_two argument1 argument2 argument3 argument4\
              argument5 argument6 argument7
  command_three
EOF
2
28.01.2020, 02:13

Внутри здесь документы, где разделитель после<<(здесьEOF)не заключен в кавычки, последовательность <backslash><newline>удалена, это продолжение строки .

На самом деле, единственный случай, когда <backslash><newline>не удаляется, это:

  • внутри одинарных кавычек
  • внутри здесь документы, в которых указан разделитель
  • где указана обратная косая черта(<backslash><backslash><newline>)

cat << EOF
foo\
bar
EOF

выходы

foobar

Итак, здесь можно сделать:

ssh user@server << EOF
  command_one
  command_two argument1 argument2 argument3 argument4 \
              argument5 argument6 argument7
  command_three
EOF

И sshв конечном итоге будет накормлен:

  command_one
  command_two argument1 argument2 argument3 argument4               argument5 argument6 argument7
  command_three

На стандартном вводе.

Даже если вы использовали :ssh... << 'EOF', чтобы избежать расширения параметров, подстановки команд и арифметического расширения, выполняемого внутри документа здесь -, sshбудет передано:

  command_one
  command_two argument1 argument2 argument3 argument4 \
              argument5 argument6 argument7
  command_three

Но удаленная оболочка будет интерпретировать это <backslash><newline>как продолжение строки, так что это будет иметь тот же эффект.

Обратите внимание, что при выполнении:

ssh user@server << EOF

sshdна удаленном узле запускает оболочку входа пользователя для интерпретации этого кода. Так как это может быть что угодно, не обязательно оболочка типа Bourne -, может быть лучше запустить:

ssh user@server sh << EOF

Где sshdработает user-s-login-shell -c sh, чтобы вы знали, что Bourne -подобная оболочка интерпретирует ваш код.

Например, JVM_ARGS="-Xms512m -Xmx25000m"./jmeter.sh...— это оболочка Bourne -или совместимый синтаксис. Это будет работать в оболочках csh, tcsh, rc, es, fish, поэтому не будет работать с ssh user@server sh << EOF, если оболочка входа userна serverбыла одной из этих снаряды.

Существенное отличие заключается в том, что в этом случае user-s-login-shellне запускается как оболочка входа в систему, поэтому не будет читать /etc/profileили~/.profile(или эквивалент для оболочки входа пользователя )для установки входа в систему. сессия вверх.

В качестве альтернативы,вы можете преобразовать этот код в синтаксис, совместимый со всеми этими оболочками :env JVM_ARGS='-Xms512m -Xmx25000m'./jmeter.sh...(, использовать одинарные кавычки вместо двойных кавычек и использовать envдля передачи env var вместо специфичного для Bourne/rc синтаксиса envvar=value cmd).

Обратной косой черты можно избежать, используяxargs:

ssh user@server sh << EOF
  command_one
  xargs command_two << END_OF_ARGS
    argument1 argument2 argument3 argument4
    argument5 argument6 argument7
  END_OF_ARGS
  command_three
EOF

Или с помощью такой оболочки, как rc, ksh93, zsh, bash, yashи массива:

С синтаксисом rc/ zsh:

ssh user@server zsh << 'EOF'
  command_one
  args=(
    argument1 argument2 argument3 argument4
    argument5 argument6 argument7
  )
  command_two $args
  command_three
EOF

(здесь цитируется EOF, так что $argsне расширяется локальной оболочкой ).

Или с синтаксисом ksh93/ bash/ yash(также работает сzsh):

ssh user@server bash << 'EOF'
  command_one
  args=(
    argument1 argument2 argument3 argument4
    argument5 argument6 argument7
  )
  command_two "${args[@]}"
  command_three
EOF
9
28.01.2020, 02:13

Теги

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