শেল কমান্ডগুলি কার্যকর হওয়ার সাথে সাথে কীভাবে ইকো করবেন


910

শেল স্ক্রিপ্টে, আমি কীভাবে সমস্ত শেল কমান্ডগুলি প্রতিধ্বনিত করব এবং কোনও পরিবর্তনশীল নাম প্রসারিত করব?

উদাহরণস্বরূপ, নিম্নলিখিত লাইন দেওয়া:

ls $DIRNAME

আমি চাই স্ক্রিপ্টটি কমান্ডটি চালিত করে নীচে প্রদর্শিত হবে

ls /full/path/to/some/dir

উদ্দেশ্যটি হ'ল সমস্ত শেল কমান্ড এবং তাদের আর্গুমেন্টের একটি লগ সংরক্ষণ করা। এই জাতীয় লগ তৈরির সম্ভবত আরও ভাল উপায় আছে?

উত্তর:


1041

set -xবা set -o xtraceভেরিয়েবল প্রসারিত করে এবং লাইনের আগে সামান্য + চিহ্ন প্রিন্ট করে।

set -vবা set -o verboseমুদ্রণের আগে ভেরিয়েবলগুলি প্রসারিত করে না।

উপরের সেটিংসটি বন্ধ করতে set +xএবং ব্যবহার করুন set +v

স্ক্রিপ্ট প্রথম লাইন উপর, এক লাগাতে পারেন #!/bin/sh -x(অথবা -v) হিসাবে একই প্রভাব set -x(অথবা -vপরে লিপিতে)।

উপরেরটিও সাথে কাজ করে /bin/sh

setবৈশিষ্ট্যগুলিতে এবং ডিবাগিংয়ে বাশ-হ্যাকারগুলির উইকি দেখুন ।

$ cat shl
#!/bin/bash                                                                     

DIR=/tmp/so
ls $DIR

$ bash -x shl 
+ DIR=/tmp/so
+ ls /tmp/so
$

7
আপনার কাছে যা দেখতে সংখ্যাযুক্ত লাইন মৃত্যুদন্ড কার্যকর করা হচ্ছে কিনা দেখতে চান stackoverflow.com/a/17805088/1729501
user13107

3
কমান্ড এবং এর ফলাফলের ফলাফলকে আলাদা করার জন্য আমি যদি কমান্ডটি রঙ করতে চাই?
লুইস চ্যান

10
প্রতিধ্বনিত হওয়ার সময় যদি আমি প্রতিটি কমান্ড ভোকালয়েড-এর মতো স্পিচ সিনথেসাইজারের মাধ্যমে গাইতে চাই, তবে আমি কী শুনতে পারি যে এটি দূর থেকে কী করছে এবং সংগীত উপভোগ করতে পারে? ইনপুট এবং আউটপুটগুলির জন্য সম্ভবত আলাদা কণ্ঠে।
এডিজেঙ্কস

(এবিএসের অনুরোধগুলির প্রতি প্রতিক্রিয়াহীন হওয়ার দীর্ঘ ইতিহাস রয়েছে যে তারা খারাপ অনুশীলনের উদাহরণগুলি সংশোধন করে, দীর্ঘদিন ধরে সম্প্রদায়ের সদস্যদের প্রতিদ্বন্দ্বী সংস্থান তৈরি করতে চালনা করার দিকে; বাশ-হ্যাকারদের উইকিতে লিংক স্থানান্তরিত করেছে - উওলিজ উইকি বা অফিসিয়াল বাশ ম্যানুয়াল আরও ভাল সংস্থান হবে)।
চার্লস ডাফি

316

set -x আপনি যা চান তা আপনাকে দেবে

এখানে প্রদর্শনের জন্য একটি শেল স্ক্রিপ্ট এখানে দেওয়া হল:

#!/bin/bash
set -x #echo on

ls $PWD

এটি সমস্ত ভেরিয়েবল প্রসারিত করে এবং কমান্ড আউটপুট করার পূর্বে সম্পূর্ণ কমান্ডগুলি মুদ্রণ করে।

আউটপুট:

+ ls /home/user/
file1.txt file2.txt

21
"ভার্বোস" শব্দটি সেভাবে ব্যবহার করা কোনও কিছুই সফল করে না। আপনি করতে পারেন set -o verboseবা set -v(কেবল " ভার্বোজ") বা set -o xtraceবা set -x(কেবল "xtrace") বা set -xv(উভয়) বা set -o xtrace -o verbose(উভয়)।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

এটি ভাল কাজ করে তবে সচেতন থাকবেন যে "
ভার্বোজ

90

কমান্ড প্রতিধ্বনি করতে এবং চালাতে আমি একটি ফাংশন ব্যবহার করি:

#!/bin/bash
# Function to display commands
exe() { echo "\$ $@" ; "$@" ; }

exe echo hello world

কোন ফলাফল

$ echo hello world
hello world

আরও জটিল কমান্ড পাইপ ইত্যাদির জন্য, আপনি eval ব্যবহার করতে পারেন:

#!/bin/bash
# Function to display commands
exe() { echo "\$ ${@/eval/}" ; "$@" ; }

exe eval "echo 'Hello, World!' | cut -d ' ' -f1"

কোন ফলাফল

$  echo 'Hello, World!' | cut -d ' ' -f1
Hello

এই উত্তরের জন্য খুব বেশি ভোট নেই। এটির কোনও খারাপ ধারণা থাকার কোনও কারণ আছে? আমার জন্য
পরিশ্রম

1
আপনি যদি প্রতিটি আদেশ মুদ্রিত না চান তবে এটি সেরা উত্তর answer এটি ++ set +xবন্ধ হওয়ার সাথে সাথে আউটপুট এড়িয়ে যায় , পাশাপাশি ক্লিনারটি দেখায়। যদিও কেবল একটি বা দুটি বিবৃতিতে, সাবসেল ব্যবহার করে ভাসেলের উত্তর সবচেয়ে সুবিধাজনক।
ব্রেন্ট ফাউস্ট

এটাই আমি খুঁজছি! না set +x, এটি সমস্ত আদেশকে প্রভাবিত করে, যা খুব বেশি!
হ্লুং

11
এর একটি বড় ক্ষতি হচ্ছে আউটপুটটি উদ্ধৃতি তথ্য হারাতে পারে। উদাহরণস্বরূপ আপনি cp "foo bar" bazএবং এর মধ্যে পার্থক্য করতে পারবেন না cp foo "bar baz"। সুতরাং এটি কোনও ব্যবহারকারীর কাছে অগ্রগতির তথ্য প্রদর্শনের জন্য ভাল; ডিবাগিং আউটপুট বা পুনরুত্পাদনযোগ্য কমান্ড রেকর্ডিংয়ের জন্য কম। বিভিন্ন ব্যবহারের ক্ষেত্রে। ইন zsh, আপনি সংশোধকটির সাথে উদ্ধৃতি সংরক্ষণ করতে পারেন :q:exe() { echo '$' "${@:q}" ; "$@" ; }
অ্যান্ড্রু জান্কে

2
আমি এই উত্তর পছন্দ করি না। অনেকগুলি প্রান্তের কেস রয়েছে যেখানে আপনি যা দেখছেন তা যা পাবেন তা নয় (বিশেষত শ্বেতক্ষেত্র, উক্তি, পালানো অক্ষর, পরিবর্তনশীল / এক্সপ্রেশন বিকল্প ইত্যাদি), তাই অন্ধভাবে একটি টার্মিনালে প্রতিধ্বনিত কমান্ডটি পেস্ট করবেন না এবং ধরে নিবেন যে এটি চলবে একইভাবে. এছাড়াও, দ্বিতীয় কৌশলটি কেবল একটি হ্যাক এবং এটি evalআপনার আদেশ থেকে শব্দটির অন্যান্য উদাহরণগুলি সরিয়ে ফেলবে । সুতরাং এটি সঠিকভাবে কাজ করবে আশা করবেন না exe eval "echo 'eval world'"!
mwfearnley

88

এছাড়াও, আপনি টগল এই তাদের মধ্যে মোড়কে আপনার স্ক্রিপ্টের মধ্যে নির্বাচন লাইনের জন্য set -xএবং set +xউদাহরণস্বরূপ,

#!/bin/bash
...
if [[ ! -e $OUT_FILE ]];
then
   echo "grabbing $URL"
   set -x
   curl --fail --noproxy $SERV -s -S $URL -o $OUT_FILE
   set +x
fi

54

নির্বাচিত রেখাগুলি প্রতিধ্বনি করার জন্য শকের উত্তরটির কয়েকটি ডাউনসাইড রয়েছে: আপনি নীচের set +xকমান্ডটিও প্রতিধ্বনিত হয়ে শেষ করবেন এবং $?এটির দ্বারা ওভাররাইট হয়ে যাওয়ার পরে আপনি প্রস্থান কোডটি পরীক্ষা করার ক্ষমতা হারাবেন set +x

আরেকটি বিকল্প হ'ল সাব-শেলের কমান্ডটি চালানো:

echo "getting URL..."
( set -x ; curl -s --fail $URL -o $OUTFILE )

if [ $? -eq 0 ] ; then
    echo "curl failed"
    exit 1
fi

যা আপনাকে এইভাবে আউটপুট দেবে:

getting URL...
+ curl -s --fail http://example.com/missing -o /tmp/example
curl failed

যদিও কমান্ডের জন্য একটি নতুন সাবশেল তৈরি করার ওভারহেডকে ব্যয় করবে।


7
++ set +xআউটপুট এড়ানোর জন্য দুর্দান্ত উপায় ।
ব্রেন্ট ফাউস্ট

3
আরও ভাল: if [ $? -eq 0 ]সঙ্গে প্রতিস্থাপন if (set -x; COMMAND)
আমেদী ভ্যান গ্যাসে

35

আর একটি বিকল্প হ'ল কমান্ড লাইনের পরিবর্তে আপনার স্ক্রিপ্টের শীর্ষে "-x" রাখুন:

$ cat ./server
#!/bin/bash -x
ssh user@server

$ ./server
+ ssh user@server
user@server's password: ^C
$

মনে রাখবেন যে এটি ./myScriptএবং এর মধ্যে ঠিক একই রকম কাজ করে না bash myScript। এখনও উল্লেখ করার জন্য একটি ভাল জিনিস, ধন্যবাদ।
এলটেন্ডেকি

27

মতে TLDP এর অধ্যায় 2. লিখন এবং ডিবাগিং স্ক্রিপ্ট: শিক্ষানবিশদের জন্য ব্যাশ গাইড :

2.3.1। পুরো স্ক্রিপ্টে ডিবাগিং

$ bash -x script1.sh

...

সোর্সফোর্সে উপলব্ধ বাশের জন্য এখন একটি পূর্ণাঙ্গ ডিবাগার রয়েছে । এই ডিবাগিং বৈশিষ্ট্যগুলি 3.x থেকে শুরু করে বাশের বেশিরভাগ আধুনিক সংস্করণে উপলব্ধ

2.3.2। স্ক্রিপ্টের অংশ (গুলি) এ ডিবাগিং

set -x            # Activate debugging from here
w
set +x            # Stop debugging from here

...

সারণী 2-1। সেট ডিবাগিং বিকল্পগুলির ওভারভিউ

    Short  | Long notation | Result
    -------+---------------+--------------------------------------------------------------
    set -f | set -o noglob | Disable file name generation using metacharacters (globbing).
    set -v | set -o verbose| Prints shell input lines as they are read.
    set -x | set -o xtrace | Print command traces before executing command.

...

বিকল্পভাবে, এই মোডগুলি প্রথম লাইনের শেল ঘোষণায় কাঙ্ক্ষিত বিকল্পগুলি যুক্ত করে স্ক্রিপ্টে নির্দিষ্ট করা যায়। বিকল্পগুলি একত্রিত করা যায়, যেমনটি ইউনিক্স কমান্ডের ক্ষেত্রে সাধারণত:

#!/bin/bash -xv

18

বাশ স্ক্রিপ্টের নামের আগে কমান্ড লাইনে "bash -x" টাইপ করুন। উদাহরণস্বরূপ, foo.sh কার্যকর করতে টাইপ করুন:

bash -x foo.sh

11

অপশনটি দিয়ে আপনি ডিবাগ মোডে বাশ স্ক্রিপ্টটি কার্যকর করতে পারেন ।-x

এটি সমস্ত কমান্ড প্রতিধ্বনি করবে।

bash -x example_script.sh

# Console output
+ cd /home/user
+ mv text.txt mytext.txt

আপনি স্ক্রিপ্টে -x বিকল্পটি সংরক্ষণ করতে পারেন । কেবল -xশেবাংয়ের বিকল্পটি নির্দিষ্ট করুন ।

######## example_script.sh ###################
#!/bin/bash -x

cd /home/user
mv text.txt mytext.txt

##############################################

./example_script.sh

# Console output
+ cd /home/user
+ mv text.txt mytext.txt

2
এছাড়াও bash -vxএকই পরিবর্তনটি পরিবর্তনীয় বিনা ছাড়াই করবে
loa_in_

4

Zsh এর জন্য, প্রতিধ্বনি করুন

 setopt VERBOSE

এবং ডিবাগিংয়ের জন্য,

 setopt XTRACE

2

জন্য cshএবং tcsh, আপনি পারেন set verboseবা set echo(অথবা আপনি এমনকি উভয় সেটআপ করতে পারেন, কিন্তু এটি কিছু অনুলিপি মধ্যে অধিকাংশ সময় হতে পারে)।

verboseবিকল্প প্রায় কাছাকাছি সঠিক শেল অভিব্যক্তি আপনি টাইপ ছাপে।

echoবিকল্প কি ডিম ছাড়ার মাধ্যমে মৃত্যুদন্ড কার্যকর করা হবে আরো পরিচায়ক।


http://www.tcsh.org/tcsh.html/Special_shell_variables.html#verbose

http://www.tcsh.org/tcsh.html/Special_shell_variables.html#echo


Special shell variables

verbose If set, causes the words of each command to be printed, after history substitution (if any). Set by the -v command line option.

echo If set, each command with its arguments is echoed just before it is executed. For non-builtin commands all expansions occur before echoing. Builtin commands are echoed before command and filename substitution, because these substitutions are then done selectively. Set by the -x command line option.



1

যৌগিক কমান্ডগুলি প্রতিধ্বনিত হওয়ার জন্য, আমি কমান্ড প্রতিধ্বনি করতে এবং চালানোর জন্য evalপ্লাস সোথের exeফাংশনটি ব্যবহার করি । এটি পাইপযুক্ত কমান্ডগুলির জন্য দরকারী যা অন্যথায় কেবল পাইপ কমান্ডের কেবলমাত্র কিছুই বা কেবল প্রাথমিক অংশটি প্রদর্শন করবে না।

ছাড়াই:

exe() { echo "\$ $@" ; "$@" ; }
exe ls -F | grep *.txt

আউটপুট:

$
file.txt

ইওল সহ:

exe() { echo "\$ $@" ; "$@" ; }
exe eval 'ls -F | grep *.txt'

কোন ফলাফল

$ exe eval 'ls -F | grep *.txt'
file.txt
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.