Похоже, что интерпретация исторического персонажа !
в действительности выполняется оболочкой current , что означает, что его отключение в оболочке, созданной su
, слишком поздно.
Кроме того, строка:
set +H && su ...
не поможет, поскольку похоже, что строка вся подвержена изменениям истории, как только вы нажмете ENTER , до set +H
вступает в силу.Даже set +H ; su ...
, похоже, не помогает в этом.
Однако следующее действительно работает, отключая историю перед строкой, которая будет его использовать:
set +H
su ...
set -H
Подробнее см. Следующую расшифровку:
pax$ cat test.data
PROD google.com
ABCD google.com
DEFG google.com
pax$ set +H
pax$ su root -c "sed -rin '/PROD/!s/google/bing/' test.data"
Password: <blah blah blah>
pax$ cat test.data
PROD google.com
ABCD bing.com
DEFG bing.com
Существует также * способ сделать это с помощью инструмента, который не вообще потребовать символ !
(если по какой-то причине вышеприведенное не работает для вас).
В соответствии со следующей расшифровкой текста, awk
будет хорошо работать (вам просто нужно подражатьsed
редактирование на месте:
pax$ cat test.data
PROD google.com
ABCD google.com
DEFG google.com
pax$ su root -c "awk '/PROD/{gsub(/google/,\"bing\")}1' test.data >xx && mv xx test.data"
Password: <blah blah blah>
pax$ cat test.data
PROD google.com
ABCD bing.com
DEFG bing.com
Вы должны экранировать "
символов в строке из-за внешних кавычек "
, но это примерно так же просто, какэто можно сделать, все еще соблюдая первоначальные намерения (насколько я понимаю).