Проблема в том, что аргумент - command
lxterminal
- это всего лишь одна строка, она не может принимать команду и ее аргументы, как некоторые другие терминалы, например ] xterm
делать.
lxterminal
анализирует эту строку, используя свои собственные правила, чтобы определить команду для запуска и ее аргументы. Это похоже, но не идентично синтаксическому анализу оболочки Борна.
Он распознает '...'
как строгие кавычки и пробел в качестве разделителя аргументов, поэтому вы можете реализовать кавычки для него как:
lxquote() {
awk -v q="'" '
function lxquote(s) {
gsub(q, q "\\" q q, s)
return q s q
}
BEGIN {
for (i = 1; i < ARGC; i++) {
printf sep "%s", lxquote(ARGV[i])
sep = " "
}
}' "$@"
}
И вызвать lxterminal
как:
lxterminal --command="$(lxquote ./script2 "$@")"
В качестве альтернативы, если интерпретатором скрипта
является bash
, вы можете сделать:
printf -v code '%q ' ./script2 "$@"
CODE=$code lxterminal --command="bash -c 'eval \"\$CODE\"'"
awkрешение:
awk '/^===/{ fn=substr($NF,2,length($NF)-3) }{ print > fn }' file
Каждому файлу будет присвоено имя в соответствии с именем хоста(SERVERNAME<number>
)
/^===/
-на линии пересечения, начинающейся с===
fn=substr($NF,2,length($NF)-3)
-создание имени файла fn
,substr($NF,2,length($NF)-3)
-будет извлекать имя хоста, игнорируя круглые скобки вокруг него($NF
-последнее поле)
print > fn
-вывести базовую строку в файл Не превышайте -регулярное выражение:
$ csplit logfile '/^===/'
Это создает xx00
для первого раздела и xx01
для второго.
В качестве альтернативы, если у вас есть другие строки, начинающиеся с ===
, которые вы не хотите разбивать на:
$ csplit logfile '/^=== Output from/'
Чтобы заменить xx
другой фиксированной строкой, используйте-p
(строка не может быть взята из входных данных, к сожалению ).