С bash это можно сделать следующим образом:
#!/usr/bin/bash
set -e
set -u
[ -v HOME ] && exec -c "$0" "$@"
# continue with the rest of the script
# e.g. print the cleaned environment:
export
set -e
и Команды set -u
не являются строго необходимыми, но я включаю их, чтобы продемонстрировать, что этот подход не полагается на доступ к неустановленным переменным (как, например, ["$ HOME"! = ""]
) и совместим с параметром set -e
.
Тестирование переменной HOME
должно быть безопасным, потому что bash выполняет сценарии в неинтерактивном режиме, то есть файлы конфигурации, такие как ~ / .bashrc
(где могут быть установлены переменные среды), не являются получен во время запуска.
Пример вывода:
declare -x OLDPWD
declare -x PWD="/home/juser"
declare -x SHLVL="1"
tail
— это , а не , замена \r
на \n
.
Это ваша mpv
программа, которая корректирует свой вывод состояния в зависимости от того, является ли ее stderr терминалом.
Тривиальный тест на то, что tail
не заменяет \r
на\n
:
$ nohup sh -c 'while printf "s=$((s=s+1))\r"; do sleep 1; done' &
[1] 3897
$ nohup: ignoring input and appending output to 'nohup.out'
$ tail -f nohup.out
s=8 # s=9, s=10... on the same line
Точно так же, как его родитель mplayer
, mpv
весьма раздражителен, когда кто-то пытается запустить его способом, отличным от того, как его представляли его авторы; Мне не удалось найти какой-либо вариант, чтобы заставить его печатать свой статус так же, как на терминале, когда его stderr является обычным файлом или каналом. Самое простое, что вы можете сделать, это запустить его в отдельном окне screen
/tmux
, а не с nohup
.