จะทราบได้อย่างไรว่าคุณอยู่ใน typescript หรือไม่?


11

ผมใช้คำสั่งในการบันทึกการส่งออกทั้งหมดจากท่าเรือไปยังไฟล์ที่เรียกว่าscript typescriptหรือจะบันทึกลงในแฟ้มscript foofoo

ตอนนี้สมมติว่าฉันกำลังพิมพ์คำสั่งหลังจากคำสั่งและฉันลืมหรือไม่ว่าฉันอยู่ใน typescript หรือไม่

ฉันจะทราบได้อย่างไรว่าฉันอยู่ในรูปแบบอักษรหรือไม่?

คำตอบ:


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หรือไม่จะปรากฏใน shell prompt ของคุณ

อีกทางเลือกหนึ่งถ้าคุณไม่สามารถรับประกันได้ว่าlsofจะติดตั้งได้ (สมมติว่า IFS ที่ไม่มีการแก้ไข):

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

แก้ปัญหาคือการได้รับชื่อคำสั่งของแม่ของผู้นำเซสชั่นซึ่งโดยทั่วไปจะเป็นจำลอง terminal ( xterm, script, screen... )


1
@teikakazura ส่วนการเรียนรู้แบบองค์รวมเป็นเพราะคุณไม่รับประกันว่าจะเป็นกระบวนการหลักของหัวหน้าเซสชัน ไม่มีส่วนเกี่ยวข้องกับ pid ที่นี่ในฐานะผู้นำเซสชันของคุณและผู้ปกครองจะยังคงอยู่รอบ ๆ เมื่อคุณเรียกใช้คำสั่งนั้น คุณสามารถพูดได้ว่าอันแรกคือฮิวริสติกและเราแค่ตรวจสอบชื่อกระบวนการ คำสั่งใด ๆ ที่ชื่อscriptและยังมีการเปิด tty จะทำให้เกิดการบวกเท็จ
Stéphane Chazelas

1
@teikakazura About (2) นั่นจะตรวจสอบ ppid ของเชลล์ปัจจุบัน ที่นี่คุณต้องการตรวจสอบ ppid ของหัวหน้าเซสชัน (โดยทั่วไปคือเชลล์ที่scriptเริ่มต้น)
Stéphane Chazelas

ฉันไม่สามารถเข้าใจ @StephaneChazelas แสดงความคิดเห็นได้ที่นี่ (สิ่งที่ "(2)" อาจจะเป็นความคิดเห็นที่ถูกลบ) แต่ส่วนที่สองของคำตอบเป็นที่น่าสนใจมากอย่างที่มันสามารถตรวจสอบได้ไม่เพียงscriptแต่ยังสถานการณ์อื่น ๆ เช่นsu -l, sshลินุกซ์และคอนโซล บางทีคนอื่น ๆ และให้ (ผ่านการโต้แย้งอื่น ๆps) ข้อมูลมากขึ้น
Stéphane Gourichon

5

ปัญหาที่น่าสนใจ ฉันพบสคริปต์ทุบตีขนาดเล็กสามารถทำงานได้อย่างน่าเชื่อถือ:

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

ฉันคิดว่านี่จะแตกต่างจาก Stephane Chazelas เล็กน้อยที่สคริปต์ของฉันทำหน้าที่เป็นผู้ปกครอง: ความสัมพันธ์ของเด็กที่กระบวนการ Linux / Unix มีจนกว่าจะพบ PID 1 หรือพบว่า "สคริปต์" เป็นกระบวนการ


4
แนวทางที่น่าสนใจ อย่างไรก็ตามโปรดทราบว่าถ้าเช่นคุณเริ่มต้นxtermจากเซสชันสคริปต์สคริปต์นั้นจะทำให้เชลล์ใน xterm นั้นทำงานภายใต้สคริปต์ มันเป็นไปในทาง แต่ผลลัพธ์จะไม่ไปที่ typescript วิธีการของฉันตรวจสอบเครื่องเทอร์มินัลที่เชื่อมโยงกับเซสชันปัจจุบันดังนั้นจะไม่มีปัญหานั้น
Stéphane Chazelas

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] "

หากเชลล์ปัจจุบันของคุณทุบตีอย่าลืมรันhash -rหลังจากสร้างไฟล์เหล่านี้เพื่อให้แน่ใจว่า ~ / bin / script ทำงานเมื่อป้อน 'script' เป็นคำสั่ง (ตรวจสอบด้วยwhich script)

ก่อนหน้านี้โปรดทราบว่าคุณต้องมี ~ / bin ใน PATH ของคุณนำหน้าพา ธ มาตรฐานเพื่อให้ใช้งานได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.