Как заполнить строку ввода терминала из содержимого файла?

Мое предложение состоит в том, что вы должны использовать сценарий оболочки, который одновременно настроит файл журнала и запустит тестовый сервер с соответствующим перенаправлением, таким образом минуя настройку systemd StandardOutput=, которая не работает. для вашего случая.

Создайте сценарий bash /etc/testServer/Debug/runTestServer.shследующим образом:

#!/usr/bin/env bash
timeStamp=$(date +%y-%m-%d_%Hh%Mm%Ss)
myfolder="/etc/testServer/Debug"
# create new logfile
touch $myfolder/started_$timeStamp
# remove old symlink if exists (owned by test1)
if [ -h $myfolder/test_outLink ]; then
    rm $myfolder/test_outLink
fi
# create new symlink
ln -s $myfolder/started_$timeStamp $myfolder/test_outLink
# run the actual testServer
exec /etc/testServer/Debug/testServer >/etc/testServer/Debug/test_outLink

Единственное отличие от исходного сценария makeOutfile.shзаключается в том, что этот сценарий выполняет testServerс соответствующим перенаправлением для отправки своего стандартного вывода в только что настроенный файл журнала.

Он также использует exec, чтобы убедиться, что сценарий оболочки не сохраняется и не заменяется на testServer(, чтобы systemd знал, что является основным процессом службы.)

В вашем юнит-файлеудалите ExecStartPre=и StandardOutput=и замените ExecStart=на:

ExecStart=/etc/testServer/Debug/runTestServer.sh

(Также возможен вызов скрипта с помощью /bin/bash, хотя это и не обязательно, если в скрипте установлен исполняемый бит.)

Настроив свой сервер с помощью такого скрипта, вы даже можете полностью обойти символическую ссылку и выполнить перенаправление непосредственно на окончательный started_$timeStampлог-файл.

Я не просматривал код systemd напрямую, и в документации нет ясности относительно взаимодействия между StandardOutput=и ExecStartPre=в частности... Но определенно есть проблема с порядком выполнения шагов. by systemd (и какой процесс их выполняет, что приводит к различным разрешениям/владельцам ), поэтому я не слишком удивлен результатами, о которых вы сообщили. Я думаю, независимо от того, моя рекомендация состояла бы в том, чтобы упростить его с помощью одного сценария исполнителя-оболочки, так что, надеюсь, это решит вашу проблему.

0
08.05.2020, 20:31
4 ответа

Загляните в.:

$ cat input
cd /etc
pwd

$. input
/etc
1
28.04.2021, 23:15

Вы можете использовать решение @DopeGhoti, но добавить его в файл ~/history, после чего его можно будет отозвать и отредактировать.

cat input >> ~/history
^r <cmd>
^e
1
28.04.2021, 23:15

В zshдля этого можно выполнить print -z "content".

Я смог создать функцию оболочки, которая делала то, что мне было нужно.

Пример здесь:

put_to_input() {
    # Push command to current terminal input line with print -z
    print -z $(cat $HOME/runfile)
}
$ cat $HOME/runfile
echo hehe
$ put_to_input
$ echo hehe # file contents appear on input line

Первоисточник :Может ли bash записывать в свой собственный входной поток?

0
28.04.2021, 23:15

В bash вы можете добавить содержимое любого файла в свою историю:

history -r file

После этого вам просто нужно нажать вверх -стрелку (так же, как Ctrl -p ), чтобы отредактировать и выполнить команды, или запустить их напрямую с помощью !.

Пример:

$ echo '~bin/start.sh my=complicated -command=that must be "edited" all the time' > file
$ history -r file
$ history
    1  echo '~/bin/start.sh my=complicated -command=that must be "edited" all the time' > file
    2  history -r file
    3  ~/bin/start.sh my=complicated -command=that must be "edited" all the time
    4  history
$ !3
Running...
0
28.04.2021, 23:15

Теги

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