Настроить экранные экраны GNU по умолчанию

Если вам нужен эквивалент 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 - это важно, если файл известен под несколькими именами (т. Е. Имеет жесткие ссылки), и вы хотите убедитесь, что вы не нарушаете ссылки.

1
20.12.2018, 02:10
1 ответ

Я использовал это в скрипте 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
0
27.01.2020, 23:50

Теги

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