Если вам нужен эквивалент sed -i.bak
, это довольно просто.
Рассмотрим этот сценарий для GNU sed:
#!/bin/sh
# Create an input file to demonstrate
trap 'rm -r "$dir"' EXIT
dir=$(mktemp -d)
grep -v '[[:upper:][:punct:]]' /usr/share/dict/words | head >"$dir/foo"
# sed program - removes 'aardvark' and 'aardvarks'
script='/aard/d'
##########
# What we want to do
sed -i.bak -e "$script" "$dir"
##########
# Prove that it worked
ls "$dir"
cat "$dir/foo"
Мы можем просто заменить отмеченную строку на
cp "$dir/foo" "$dir/foo.bak" && sed -e "$script" "$dir/foo.bak" >"$dir/foo"
. Это перемещает существующий файл в качестве резервной копии и записывает новый файл.
Если нам нужен эквивалент
sed -i -e "$script" "$dir" # no backup
, то это немного сложнее. Мы можем открыть файл для чтения в качестве стандартного ввода, а затем отсоединить его, прежде чем направить вывод sed для его замены:
( cp "$dir/foo" "$dir/foo.bak"; exec <"$dir/foo.bak"; rm "$dir/foo.bak"; exec sed -e "$script" >"$dir/foo" )
Мы делаем это во вспомогательной оболочке, так что наш исходный stdin все еще доступен после этого. Можно переключать входы и переключаться обратно без подоболочки, но мне этот способ кажется более понятным.
Обратите внимание, что мы стараемся сначала скопировать, а не создавать новый файл foo
- это важно, если файл известен под несколькими именами (т. Е. Имеет жесткие ссылки), и вы хотите убедитесь, что вы не нарушаете ссылки.
Я использовал это в скрипте init.d:
su someUserName -c 'screen -S someSesseionName -dm'
После этого вы можете использовать опцию stuff для запуска процессов и других действий в сеансе screen.
export NEWLINE=$(echo -ne '\015')
su someUserName -c "screen -S someSesseionName -p 0 -X stuff 'ls -lash${NEWLINE}'"
В /etc/screenrc могут потребоваться настройки для включения многопользовательского режима, чтобы это работало. Я использовал это в течение многих лет для запуска бесконечных процессов, которые позволяют постоянно взаимодействовать с пользователем на безголовых хостах x86 Linux. Это позволяет пользователям после загрузки -получать доступ к сеансам, присоединяясь к ним как обычные пользователи :
.screen -S someUserName/someSesseionName -x