क्या शेल विस्तार को प्रिंट करना संभव है?


18

मुझे पता है कि नियमों का एक विशिष्ट सेट है जो शेल उपयोगकर्ता द्वारा टाइप किए गए कमांड का विस्तार करता है। (चलो बैश शेल के बारे में बात करते हैं।)

क्या शेल विस्तार के बाद फॉर्म में कमांड प्रिंट करना संभव है? यह सीखने के लिए एक अच्छी उपयोगिता प्रतीत होती है और यह सुनिश्चित करती है कि शेल विशेष वर्णों का विस्तार कैसे करता है।

जैसे

$ echo *

{all the filenames in current dir}

मैं विस्तारित कमांड का प्रिंट आउट लेना चाहता हूं, जो निम्नलिखित पंक्ति है:

echo {all the filenames in .}

जवाबों:


13

बस उपयोग करें echo... इसे उस कमांड के सामने रखें जिसे आप विस्तारित करना चाहते हैं। मैं इसे अक्सर उपयोग करता हूं।

$ ls
one.txt
two.txt
three.dat
$ echo rm *.txt
rm one.txt two.txt
$ rm *.txt

आप उपयोग कर सकते हैं Homeऔर Delजल्दी से ठीक पहले हटाने / जोड़ने के लिए echo

EDIT
जैसा कि टिप्पणियों में बताया गया है, यह काम नहीं करेगा यदि कमांड केवल एक साधारण कमांड नहीं है (जैसे कि यदि यह forलूप है, तो पाइप का उपयोग करता है |, &&या ऐसा कुछ भी)।


1
एक स्क्रिप्ट का परीक्षण करते समय यही मैं करता हूं
बरमार

यह अभी भी अन्य शेल टोकन से प्रभावित है echo cat * | someprogramआप इस उत्तर से क्या सोच सकते हैं।
क्रॉल्टन

13

आप उपयोग कर सकते हैं set -x

उदाहरण के लिए, स्क्रिप्ट पर विचार करें:

$ cat script.sh
set -x
echo *

जब चलाया जाता है, तो यह echoवास्तव में निष्पादित करने से पहले विस्तारित विवरण दिखाता है:

$ bash script.sh
+ echo file1 file2 file3 script.sh
file1 file2 file3 script.sh

और, जैसा कि कुंडोर बताते हैं, यह कमांड लाइन पर अंतःक्रियात्मक रूप से भी काम करता है :

$ set -x
+ set -x
$ echo *
+ echo file1 file2 file3 script.sh
file1 file2 file3 script.sh

प्रलेखन

man bashबताते हैं कि set -xनिम्नानुसार क्या है:

प्रत्येक साधारण कमांड का विस्तार करने के बाद, कमांड के लिए, कमांड कमांड, कमांड का चयन करें, या कमांड के लिए अंकगणित, PS4 के विस्तारित मूल्य को प्रदर्शित करें, उसके बाद कमांड और उसके विस्तारित तर्क या संबंधित शब्द सूची।

डिफ़ॉल्ट मान के लिए PS4, जैसा कि ऊपर दिखाया गया है, एक स्थान के बाद एक प्लस चिह्न है।


2
और यह एक इंटरैक्टिव शेल में ठीक काम करता है, वह भी (जो मुझे लगता है कि ओपी की तलाश है।)
निक मैटेओ

7

एक इंटरैक्टिव खोल लिए, दबाकर Ctrl+xद्वारा पीछा *ग्लोब पैटर्न है कि ग्लोब पैटर्न का विस्तार के साथ अपने आदेश पंक्ति संपादित करेंगे टाइप करने के बाद। बैश मैन पेज से:

ग्लोब-विस्तार-शब्द ( C-x *)

बिंदु से पहले शब्द को पाथनेम विस्तार के लिए एक पैटर्न के रूप में माना जाता है, और शब्द की जगह फ़ाइल नामों के मिलान की सूची डाली जाती है। यदि कोई संख्यात्मक तर्क दिया जाता है, तो पथप्रदर्शन विस्तार से पहले तारांकन जोड़ा जाता है।

आपको ग्लोब-लिस्ट-एक्सपैंशन ( Ctrl+x, g) में भी दिलचस्पी हो सकती है ।


मैं मैक ओएस से बैश का उपयोग कर रहा हूं। मैंने ctrl + x, कमांड + x की कोशिश की। मुझे यकीन नहीं है कि यह कोई कमांड लाइन संपादन करता है। क्या आप और अधिक विस्तृत कर सकते हैं?
वीशी ज़ेंग

@ WeishiZeng मुझे नहीं पता कि यह आपके लिए काम क्यों नहीं कर रहा है। क्या आपने Ctrl+x, *टाइप करने के तुरंत बाद echo *और एंटर की दबाने से पहले प्रेस किया था? यदि यह अभी भी काम नहीं करता है, तो आप ~/.inputrcग्लोब-विस्तार-शब्द को किसी अन्य चीज़ में संशोधित और बाँध सकते हैं ।
jamesdlin

contrl + x कर्सर को इको शब्द में ले जाता है, लेकिन कुछ भी संपादित नहीं करता है। "Ctrl + x, " इसका क्या मतलब है ?? (क्या यह ctrl + x या ctrl + ??) * Shift पर है, इसलिए मुझे * सही पाने के लिए Shift के साथ-साथ प्रेस करना होगा?
वीशी ज़ेंग

Ctrl+xइसके बाद प्रेस करें Shift+8। यदि आप Ctrl+x, gकाम करते हैं, या, जैसा कि मैंने पहले कहा था, आप .inputrcफ़ाइल में अपनी खुद की कुंजी असाइन कर सकते हैं ।
22

1

यदि आप यह देखना चाहते हैं कि तर्कों का विस्तार या टोकन कैसे किया जाता है, तो आप एक प्रोग्राम या स्क्रिप्ट का उपयोग कर सकते हैं जो इसके तर्कों को प्रिंट करता है। यहाँ एक कार्यान्वयन है bash:

#!/bin/bash

for (( i = 0; i <= $#; ++i )); do
    printf 'argv[%d] = %s\n' $i "${!i}"
done

मान लें कि आपने इसे एक फ़ाइल में रखा है printargs.sh(और इसे निष्पादन योग्य बनाया गया है), तो आपको इस तरह से आउटपुट मिलेगा

$ ./printargs.sh a{1..3}b
argv[0] = ./printargs.sh
argv[1] = a1b
argv[2] = a2b
argv[3] = a3b
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.