Bagaimana cara mengetahui apakah Anda menggunakan naskah?

11

Saya menggunakan scriptperintah untuk menyimpan semua output dari terminal ke file bernama typescript. Atau script foountuk menyimpan ke file foo.

Sekarang, katakanlah saya akan mengetik perintah demi perintah dan saya lupa apakah saya dalam naskah atau tidak.

Bagaimana saya bisa mengetahui apakah saya dalam naskah atau tidak?

Rob Avery IV
sumber

Jawaban:

7

Mungkin dengan:

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

Anda dapat menambahkan sesuatu seperti:

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

Ke Anda ~/.zshrcatau ~/.bashrc, jadi informasi apakah Anda berada di scriptatau tidak akan terlihat pada prompt shell Anda.

Atau, jika Anda tidak dapat menjamin bahwa Anda lsofdapat menginstalnya (dengan asumsi IFS yang tidak dimodifikasi):

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

Heuristik adalah untuk mendapatkan nama perintah dari induk dari pemimpin sesi yang umumnya akan menjadi terminal emulator ( xterm, script, screen...).

Stéphane Chazelas
sumber
1
@teikakazura, bagian heuristik adalah karena Anda tidak dijamin bahwa itu akan menjadi proses induk dari pemimpin sesi. Tidak ada hubungannya dengan pid digunakan kembali di sini sebagai pemimpin sesi Anda dan orang tuanya biasanya masih ada ketika Anda menjalankan perintah itu. Anda bisa mengatakan bahwa yang pertama adalah heuristik dan kami hanya memeriksa nama proses. Perintah apa pun yang namanya juga terbuka scriptdan memiliki tty juga akan menyebabkan false positive.
Stéphane Chazelas
1
@teikakazura Tentang (2), yang akan memeriksa ppid dari shell saat ini. Di sini, Anda ingin memeriksa halaman pemimpin sesi (biasanya, itu akan menjadi shell yang scriptdimulai).
Stéphane Chazelas
Saya tidak mengerti komentar @StephaneChazelas di sini (apa itu "(2)", mungkin komentar yang dihapus), tetapi bagian kedua dari jawabannya sangat menarik karena dapat mendeteksi tidak hanya scripttetapi juga situasi lain, seperti su -l, sshkonsol Linux dan mungkin orang lain, dan memberikan (melalui argumen lain ps) informasi lebih banyak.
Stéphane Gourichon
5

Masalah menarik. Saya menemukan skrip bash kecil dapat melakukan pekerjaan dengan cukup andal:

#!/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"

Saya pikir ini sedikit berbeda dari yang diusulkan oleh Stephane Chazelas, di mana skrip saya berjalan naik ke atas induk: hubungan anak yang dimiliki proses Linux / Unix sampai ia menemukan PID 1, atau ia menemukan "skrip" sebagai proses.

Bruce Ediger
sumber
4
Pendekatan yang menarik. Namun, perhatikan bahwa jika misalnya, Anda memulai xtermdari sesi skrip Anda, skrip itu akan membuat shell di xterm itu berjalan di bawah skrip. Yah itu dengan cara, tetapi output tidak pergi ke naskah. Pendekatan saya memeriksa terminal yang terkait dengan sesi saat ini sehingga tidak akan memiliki masalah itu.
Stéphane Chazelas
0

Jika Anda memiliki bin / direktori pribadi di jalur Anda (mis. / Home / user / bin, letakkan skrip shell di sana dengan nama 'skrip' (nama yang sama dengan biner), dengan konten berikut:

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

Sekarang, dalam skrip berjalan, Anda dapat menguji untuk variabel lingkungan SCRIPT_RUNNING, dan melakukan apa pun yang Anda inginkan berdasarkan itu.

EDIT:

Sebenarnya, ada cara yang jauh lebih mudah. Berikut ini mengatakan semuanya, buat tiga file, ~ / bin / script, ~ / bin / script-shell dan ~ / .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] "

Jika shell Anda sekarang adalah bash, jangan lupa untuk menjalankan hash -rsetelah membuat file-file ini, untuk memastikan ~ / bin / script dijalankan ketika 'script' dimasukkan sebagai perintah (periksa dengan which script).

Seperti sebelumnya, perhatikan bahwa Anda harus memiliki ~ / bin di PATH Anda, sebelum jalur standar agar ini berfungsi.

Roadowl
sumber