Làm thế nào để biết nếu bạn đang ở trong một bản thảo?


11

Tôi đang sử dụng scriptlệnh để lưu tất cả đầu ra từ thiết bị đầu cuối vào một tệp có tên typescript. Hoặc script foođể lưu vào tập tin foo.

Bây giờ, giả sử tôi đang thực hiện gõ lệnh sau lệnh và tôi quên liệu tôi có trong bản thảo hay không.

Làm thế nào tôi có thể tìm hiểu nếu tôi trong một bản thảo hay không?

Câu trả lời:


7

Có thể với:

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

Bạn có thể thêm một cái gì đó như:

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

Đối với ~/.zshrchoặc ~/.bashrc, do đó, thông tin về việc bạn vào scripthay không sẽ hiển thị trên dấu nhắc shell của bạn.

Ngoài ra, nếu bạn không thể đảm bảo rằng đã lsofđược cài đặt, bạn có thể làm (giả sử IFS chưa sửa đổi):

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

Các heuristic là để có được những tên chỉ huy của phụ huynh của nhà lãnh đạo phiên mà nói chung sẽ là mô phỏng thiết bị ( xterm, script, screen...).


1
@teikakazura, phần heuristic là vì bạn không được đảm bảo rằng đó sẽ là quy trình chính của người lãnh đạo phiên. Không có gì để làm với việc tái sử dụng ở đây vì người lãnh đạo phiên của bạn và cha mẹ của nó thường sẽ vẫn ở đó khi bạn chạy lệnh đó. Bạn có thể nói rằng cái đầu tiên là heuristic cũng như chúng ta chỉ kiểm tra tên quy trình. Bất kỳ lệnh nào có tên cũng scriptvà có tty mở cũng sẽ gây ra dương tính giả.
Stéphane Chazelas

1
@teikakazura Giới thiệu (2), sẽ kiểm tra ppid của vỏ hiện tại. Tại đây, bạn muốn kiểm tra ppid của người lãnh đạo phiên (thông thường, đó sẽ là trình bao scriptbắt đầu).
Stéphane Chazelas

Tôi không thể hiểu bình luận của @StephaneChazelas ở đây ("(2)", có lẽ là một bình luận đã bị xóa), nhưng phần thứ hai của câu trả lời rất thú vị vì nó có thể phát hiện không chỉ scriptcác tình huống khác, như su -l, sshbảng điều khiển Linux và có lẽ những người khác, và cung cấp (thông qua các đối số khác của ps) nhiều thông tin hơn.
Stéphane Gourmetichon

5

Vấn đề thú vị. Tôi tìm thấy một tập lệnh bash nhỏ có thể thực hiện công việc khá đáng tin cậy:

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

Tôi nghĩ rằng điều này hơi khác so với đề xuất của Stephane Chazelas, trong đó kịch bản của tôi hoạt động theo cách cha mẹ: mối quan hệ con mà các quy trình Linux / Unix có cho đến khi nó tìm thấy PID 1, hoặc nó tìm thấy "script" là quá trình.


4
Cách tiếp cận thú vị. Tuy nhiên, lưu ý rằng nếu chẳng hạn, bạn bắt đầu xtermtừ phiên tập lệnh của mình, tập lệnh đó sẽ tạo ra trình bao trong xterm đó đang chạy theo tập lệnh. Vâng, đó là một cách, nhưng đầu ra sẽ không đi đến bản thảo. Cách tiếp cận của tôi kiểm tra thiết bị đầu cuối liên quan đến phiên hiện tại vì vậy sẽ không có vấn đề đó.
Stéphane Chazelas

0

Nếu bạn có một thư mục bin / thư mục cá nhân trong đường dẫn của mình (ví dụ / home / user / bin, hãy đặt tập lệnh shell ở đó với tên 'script' (cùng tên với tệp nhị phân), với nội dung sau:

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

Bây giờ, trong tập lệnh đang chạy, bạn có thể kiểm tra biến môi trường SCRIPT_RUNNING và làm bất cứ điều gì bạn muốn dựa trên nó.

BIÊN TẬP:

Trên thực tế, có một cách dễ dàng hơn nhiều. Phần sau đây nói lên tất cả, tạo ba tệp, ~ / bin / script, ~ / bin / script-shell và ~ / .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] "

Nếu shell hiện tại của bạn bị bash, đừng quên chạy hash -rsau khi tạo các tệp này, để đảm bảo ~ / bin / script được chạy khi 'script' được nhập dưới dạng lệnh (kiểm tra which script).

Như trước đây, lưu ý rằng bạn phải có ~ / bin trong PATH của bạn, trước đường dẫn chuẩn để điều này hoạt động.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.