sed в сценарии bash: неизвестная команда: `''`

Во-первых, вы можете упростить свою задачу, вырезав один из промежуточных процессов. :Здесь нет причин использовать sh -cдля запуска вашего процесса. Фактически, это потенциально менее безопасно, если ваша фактическая командная строка построена динамически. Вместо:

execl("/bin/sh","sh","-c","sudo nmap -sS -A 192.168.0.1/24",NULL);

Вы должны просто сделать:

execlp("sudo", "sudo", "nmap", "-sS", "-A", "192.168.0.1/24", NULL);

Теперь у вас есть только два процесса :sudoи сам nmap. Вы знаете идентификатор родительского процесса (sudo), но не знаете идентификатор дочернего процесса (nmap). Но это не имеет значения, потому что вы можете использовать функциюsudo:убить родителя (с помощью SIGTERM), и он перешлет сигнал потомку для вас.

Ваша последняя оставшаяся проблема не связана напрямую с вопросом, который вы задаете, но в любом случае у вас, вероятно, нет разрешения на завершение любого из этих процессов! Поскольку задействован sudo, целью которого является повышение его привилегий, у вас, вероятно, нет разрешения на отправку его или его дочерних сигналов.

0
24.10.2019, 16:36
2 ответа

Для $'...', как и в струнах C, \fпредставляет собой форму -feed (FF, ^L ). Новая строка — это \nстрока -подача (LF, ^J ). В стандарте sedв замещающей части команды sона должна быть вставлена ​​с \, за которым следует символ LF :

.

Так ты хочешь:

#! /bin/sh -
< file.txt sed '
  s|^some-string|\
&|'

С$'...':

#! /bin/bash -
< file.txt sed $'s|^some-string|\\\n&|'

В реализации GNU sedвы также можете использовать \nдля обозначения новой строки/LF в замене:

#! /bin/sh -
< file.txt gnu-sed 's|^some-string|\n&|'

В любом случае, ни в одной из этих команд нет апострофа, переданного в sed. '...'и $'...'являются кавычками операторов оболочки, первый (стандарт )использовался для дословной передачи того, что внутри, в sed, второй (расширение ksh93 теперь поддерживается несколькими другими оболочками. в том числеbash)используется для расширения таких последовательностей, как \f, \nв них перед переходом к sed.

Если вы хотите передать литерал 'в sed, например, чтобы передать ему команду y/'/"/для замены 'на ", вы должны использовать оператор кавычек оболочки, который позволяет передавать ',который включает в себя все операторы цитирования , кроме самого'...':

sed $'y/\'/"/'  # $'...' quoting operator
sed "y/'/\"/"   # "..." quoting operator
sed y/\'/\"/    # \x quoting operator
1
28.01.2020, 02:29

Самый простой способ добиться этого:

$ sed -e '/^some_string/!b'  - e 'H;s/.*//;x' filename 
1
28.01.2020, 02:29

Теги

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