Как узнать, есть ли у вас машинопись?

11

Я использую scriptкоманду, чтобы сохранить весь вывод из терминала в файл с именем typescript. Или script fooсохранить в файл foo.

Теперь, допустим, я продолжаю набирать команду за командой, и я забываю, нахожусь ли я в машинописи или нет.

Как я могу узнать, нахожусь ли я внутри машинописного текста или нет?

Роб Эвери IV
источник

Ответы:

7

Может быть с:

if lsof -tac script "$(tty)" > /dev/null; then
  echo "I'm running under script"
else
  echo "I'm not"
fi

Вы можете добавить что-то вроде:

lsof -tac script "$(tty)" > /dev/null && PS1="[script] $PS1"

Для вас ~/.zshrcили ~/.bashrc, таким образом, информация о том, находитесь ли вы scriptили нет, будет отображаться в приглашении оболочки.

В качестве альтернативы, если вы не можете гарантировать lsofустановку, вы можете сделать это (при условии неизмененного IFS):

terminal=$(ps -o comm= -p $(ps -o ppid= -p $(ps -o sid= -p "$$")))
[ "$terminal" = script ] && PS1="[script] $PS1"

Эвристика , чтобы получить имя команды родителя лидера сеанса , который обычно будет эмулятор терминала ( xterm, script, screen...).

Стефан Шазелас
источник
1
@teikakazura, эвристическая часть состояла в том, что вы не гарантированы, что это будет родительский процесс лидера сеанса. Здесь нет ничего общего с повторным использованием pid, так как ваш лидер сеанса и его родитель обычно будут присутствовать при запуске этой команды. Можно сказать, что первый - эвристический, так как мы просто проверяем имя процесса. Любая команда, имя которой также scriptимеет открытый tty, также может привести к ложному срабатыванию.
Стефан
1
@teikakazura О (2), который будет проверять ppid текущей оболочки. Здесь вы хотите проверить ppid лидера сеанса (обычно это scriptзапускаемая оболочка ).
Стефан
Я не могу понять комментарий @StephaneChazelas здесь (что такое "(2)", вероятно, удаленный комментарий), но вторая часть ответа очень интересна, поскольку она может обнаруживать не только, scriptно и другие ситуации, например su -l, sshконсоль Linux и возможно, другие, и предоставить (через другие аргументы ps) гораздо больше информации.
Стефан Гурихон
5

Интересная проблема. Я обнаружил, что небольшой bash-скрипт может сделать работу довольно надежно:

#!/bin/bash

PP=$(ps -o ppid= $$)

while [[ $PP != 1 ]]
do
    LINE=$(ps -o ppid= -o comm= $PP | sed 's/^  *//')
    COMM=${LINE#* }
    PP=${LINE%% *}
    if [[ $COMM == script ]]  # Might need a different comparison
    then
        echo "In script"
        exit 0
    fi
done
echo "Not in script"

Я думаю, что это немного отличается от того, что предложил Стефан Чазелас, в том, что мой сценарий работает по пути родительские: дочерние, которые имеют процессы Linux / Unix, пока не найдет PID 1 или не найдет «сценарий» как процесс.

Брюс Эдигер
источник
4
Интересный подход. Тем не менее, обратите внимание, что если, например, вы запустите xtermсеанс сценария, этот сценарий запустит оболочку в этом xterm под сценарием. Ну, это в некотором роде, но вывод не идет на машинопись. Мой подход проверяет терминал, связанный с текущим сеансом, поэтому не будет иметь этой проблемы.
Стефан Шазелас
0

Если у вас есть личный каталог bin / в вашем пути (например, / home / user / bin, поместите туда сценарий оболочки с именем «script» (то же имя, что и двоичный файл), со следующим содержимым:

#!/bin/bash
export SCRIPT_RUNNING=1
exec /usr/bin/script # full path to your script(1) binary

Теперь, во время выполнения скрипта, вы можете проверить переменную среды SCRIPT_RUNNING и делать все, что вы хотите, основываясь на ней.

РЕДАКТИРОВАТЬ:

На самом деле, есть гораздо более простой способ. Следующее говорит само за себя, создайте три файла, ~ / bin / script, ~ / bin / script-shell и ~ / .scriptrc:

~ > ls ~/bin/script ~/bin/script-shell ~/.scriptrc
-rw-r--r-- 1 roadowl users 23 Oct 18 16:52 /home/roadowl/.scriptrc
-rwx------ 1 roadowl users 49 Oct 18 16:53 /home/roadowl/bin/script
-rwx------ 1 roadowl users 56 Oct 18 16:55 /home/roadowl/bin/script-shell

~/bin > cat script
#!/bin/bash
exec /usr/bin/script -c script-shell

~/bin > cat script-shell
#!/bin/bash
exec /bin/bash --rcfile /home/bjd/.scriptrc

~/bin > cat ~/.scriptrc
export PS1="[script] "

Если ваша текущая оболочка - bash, не забудьте запустить ее hash -rпосле создания этих файлов, чтобы убедиться, что ~ / bin / script запускается при вводе 'script' в качестве команды (проверьте с помощью which script).

Как и раньше, обратите внимание, что у вас должен быть ~ / bin в вашем PATH, предшествующий стандартному пути, чтобы это работало.

Roadowl
источник