Во-первых, вы можете упростить свою задачу, вырезав один из промежуточных процессов. :Здесь нет причин использовать 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
, целью которого является повышение его привилегий, у вас, вероятно, нет разрешения на отправку его или его дочерних сигналов.
Для $'...'
, как и в струнах 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
Самый простой способ добиться этого:
$ sed -e '/^some_string/!b' - e 'H;s/.*//;x' filename