Yazı tipinde olup olmadığınızı nasıl anlarsınız?


11

scriptTerminalden tüm çıktıları adlandırılmış bir dosyaya kaydetmek için komutu kullanıyorum typescript. Veya script foodosyaya kaydetmek için foo.

Şimdi diyelim ki komuttan sonra komut yazıyorum ve bir daktiloda olup olmadığımı unutuyorum.

Yazı tipinde olup olmadığımı nasıl öğrenebilirim?

Yanıtlar:


7

Belki de:

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

Şöyle bir şey ekleyebilirsiniz:

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

Sizin ~/.zshrcya da ~/.bashrc, böylece içinde olup olmadığınıza dair bilgiler scriptkabuk isteminizde görünür olacaktır.

Alternatif olarak, lsofyükleneceğini garanti edemezseniz (değiştirilmemiş bir IFS varsayarak) şunları yapabilirsiniz:

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

Sezgisel genellikle terminal emülatörü olacağını oturum liderinin ebeveynin komut adını elde etmektir ( xterm, script, screen...).


1
@teikakazura, buluşsal bölüm, oturum liderinin ana süreci olacağından emin olmamanızdı. Oturum yöneticiniz ve üst öğesi olarak buradaki pid yeniden kullanımı ile ilgisi yoktur, bu komutu çalıştırdığınızda tipik olarak hala etrafta olacaktır. Birincisinin sezgisel olduğunu ve sadece süreç adını kontrol ettiğimizi söyleyebilirsiniz . Ayrıca adı scriptve tty açık olan herhangi bir komut da yanlış pozitif neden olur.
Stéphane Chazelas

1
@teikakazura Yaklaşık (2), mevcut kabuğun ppid'ini kontrol eder. Burada, oturum liderinin ppid'ini kontrol etmek istersiniz (genellikle, scriptbaşlatılan kabuk olurdu ).
Stéphane Chazelas

Ben ( ") (2" ne muhtemelen silinen yorumunu) @StephaneChazelas burada yorum anlayamıyorum ama sadece algılayabilir olarak cevabın ikinci kısmı çok ilginç scriptaynı zamanda diğer durumları gibi su -l, sshLinux konsol ve belki diğerleri, ve (diğer argümanlarla ps) çok daha fazla bilgi sağlar.
Stéphane Gourichon

5

İlginç bir sorun. Küçük bir bash betiğinin işi oldukça güvenilir bir şekilde yapabileceğini buldum:

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

Bence bu senaryo Stephane Chazelas tarafından önerilenden biraz farklı, betiğim ebeveyn / çocuk ilişkisini PID 1 bulunana kadar veya süreç olarak "betik" bulana kadar üst düzey bir çocuk ilişkisine getiriyor.


4
İlginç bir yaklaşım. Ancak, örneğin, bir xtermkomut dosyası oturumunuzdan başlatırsanız , bu komut dosyasının o xterm'deki kabuğun komut dosyası altında çalışacağını unutmayın. Peki bu bir bakıma, ama çıktı daktiloya gitmiyor. Benim yaklaşım geçerli oturum ile ilişkili terminali denetler, bu yüzden bu sorunu olmaz.
Stéphane Chazelas

0

Yolunuzda kişisel bir bin / dizininiz varsa (ör. / Home / user / bin, oraya 'script' adıyla (ikili ile aynı ad) bir kabuk betiği yerleştirin ve aşağıdaki içeriklerle:

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

Şimdi, komut dosyası çalıştırıldığında, SCRIPT_RUNNING ortam değişkenini test edebilir ve buna dayalı olarak istediğinizi yapabilirsiniz.

DÜZENLE:

Aslında, çok daha kolay bir yol var. Aşağıdaki her şeyi söylüyor, üç dosya oluşturun, ~ / bin / script, ~ / bin / script-shell ve ~ / .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] "

Geçerli kabuğunuz bash ise, hash -r'script' komut olarak girildiğinde ~ / bin / script'in çalıştığından emin olmak için bu dosyaları oluşturduktan sonra çalıştırmayı unutmayın (kontrol edin which script).

Daha önce olduğu gibi, PATH'ınızda bunun çalışması için standart yoldan önce ~ / bin olması gerektiğini unutmayın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.