Heuristik adalah untuk mendapatkan nama perintah dari induk dari pemimpin sesi yang umumnya akan menjadi terminal emulator ( xterm, script, screen...).
@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.
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:
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.
script
dan memiliki tty juga akan menyebabkan false positive.script
dimulai).script
tetapi juga situasi lain, sepertisu -l
,ssh
konsol Linux dan mungkin orang lain, dan memberikan (melalui argumen lainps
) informasi lebih banyak.Masalah menarik. Saya menemukan skrip bash kecil dapat melakukan pekerjaan dengan cukup andal:
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.
sumber
xterm
dari 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.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:
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:
Jika shell Anda sekarang adalah bash, jangan lupa untuk menjalankan
hash -r
setelah membuat file-file ini, untuk memastikan ~ / bin / script dijalankan ketika 'script' dimasukkan sebagai perintah (periksa denganwhich script
).Seperti sebelumnya, perhatikan bahwa Anda harus memiliki ~ / bin di PATH Anda, sebelum jalur standar agar ini berfungsi.
sumber