कैसे पता करें कि आप टाइपस्क्रिप्ट में हैं?


11

मैं scriptटर्मिनल से फ़ाइल में सभी आउटपुट को बचाने के लिए कमांड का उपयोग कर रहा हूं जिसे फ़ाइल कहा जाता है typescript। या script fooफाइल को सेव करने के लिए foo

अब, मान लें कि मैं कमांड के बाद टाइपिंग कमांड के साथ जा रहा हूं और मैं भूल जाता हूं कि मैं टाइपस्क्रिप्ट में हूं या नहीं।

मैं कैसे पता लगा सकता हूं कि मैं टाइपस्क्रिप्ट के भीतर हूं या नहीं?

जवाबों:


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अपने शेल प्रॉम्प्ट पर दिखाई दे रहे हैं या नहीं।

वैकल्पिक रूप से, यदि आप यह गारंटी नहीं दे सकते हैं कि lsofस्थापित किया जा सकता है (एक अनमॉडिफाइड IFS मानकर):

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

अनुमानी जो आम तौर पर टर्मिनल एमुलेटर होगा सत्र नेता की मूल की कमान नाम पाने के लिए है ( xterm, script, screen...)।


1
@teikakazura, अनुमानी हिस्सा है क्योंकि आप इसकी गारंटी नहीं कर रहे हैं कि यह सत्र नेता की मूल प्रक्रिया होगी था। अपने सत्र के नेता और उसके माता-पिता के रूप में यहाँ पुन: उपयोग के साथ कुछ भी नहीं करना है, जब आप उस आदेश को चलाते हैं तो आमतौर पर इसके माता-पिता अभी भी आस-पास होंगे। आप कह सकते हैं कि पहले वाला विधर्मी है और साथ ही हम प्रक्रिया नाम की जाँच कर रहे हैं। कोई भी आदेश जिसका नाम भी है scriptऔर ट्टी ओपन है, यह भी एक गलत सकारात्मक कारण होगा।
स्टीफन चेज़लस

1
@teikakazura के बारे में (2), जो वर्तमान शेल के ppid की जाँच करेगा। यहां, आप सत्र के नेता के ppid की जांच करना चाहते हैं (आमतौर पर, यह वह शेल होगा जो scriptशुरू हुआ था)।
स्टीफन चेज़लस

मुझे समझ में नहीं कर सकते @StephaneChazelas यहाँ टिप्पणी (क्या है "(2)", शायद हटाई गई टिप्पणी), लेकिन इस सवाल का जवाब के दूसरे भाग के रूप में यह न केवल पता लगा सकते हैं बहुत ही दिलचस्प है script, लेकिन यह भी अन्य स्थितियों, जैसे su -l, ssh, लिनक्स कंसोल और शायद अन्य, और psअधिक जानकारी के (अन्य तर्कों के माध्यम से ) प्रदान करते हैं।
स्टीफन गौरिचोन

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"

मुझे लगता है कि यह स्टीफन चेज़ेलस द्वारा प्रस्तावित की तुलना में थोड़ा अलग है, इसमें मेरी स्क्रिप्ट माता-पिता: बच्चे के संबंध को काम करती है: लिनक्स / यूनिक्स प्रक्रियाएं जब तक पीआईडी ​​1 नहीं पाती हैं, या यह प्रक्रिया के रूप में "स्क्रिप्ट" ढूंढती है।


4
दिलचस्प दृष्टिकोण। हालाँकि, ध्यान दें कि यदि उदाहरण के लिए, आप xtermअपने स्क्रिप्ट सत्र से प्रारंभ करते हैं, तो वह स्क्रिप्ट उस चीज़ को खोल देगी जो उस स्क्रिप्ट में चल रही है। वैसे यह एक तरह से है, लेकिन आउटपुट टाइपस्क्रिप्ट में नहीं जा रहा है। मेरा दृष्टिकोण वर्तमान सत्र से जुड़े टर्मिनल की जाँच करता है, इसलिए यह मुद्दा नहीं होगा।
स्टीफन चेज़लस

0

यदि आपके पास एक व्यक्तिगत बिन / निर्देशिका आपके मार्ग में है (उदाहरण के लिए / होम / उपयोगकर्ता / बिन, तो निम्न स्क्रिप्ट के साथ 'स्क्रिप्ट' (बाइनरी के समान नाम) नाम के साथ एक शेल स्क्रिप्ट रखें:

#!/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 चलाया जाता है जब 'स्क्रिप्ट' को कमांड (चेक के साथ which script) के रूप में दर्ज किया जाता है ।

पहले की तरह, ध्यान दें कि आपके PATH में ~ / bin होना चाहिए, इसके लिए मानक पथ को काम करने से पहले।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.