এটি প্রিন্ট না করে বাশ সেট + এক্স


95

কেউ কি জানে যে আমরা set +xএটি প্রিন্ট না করে বাশে বলতে পারি :

set -x
command
set +x

ট্রেস

+ command
+ set +x

তবে এটি কেবল মুদ্রণ করা উচিত

+ command

বাশ সংস্করণ 4.1.10 (4)। এটি এখন কিছু সময়ের জন্য আমাকে বাগিয়ে দিচ্ছে - আউটপুটটি অকেজো set +xলাইনের সাথে বিশৃঙ্খল হয়ে গেছে , এটি ট্রেস সুবিধাটি যতটা কার্যকর হতে পারে তেমন কার্যকর হয় না।


এটি আপনার প্রশ্নের উত্তর দেয় না, তবে আপনি যখন আপনার স্ক্রিপ্টটি চালান তখন কেন নয়:script.sh 2>&1 | grep -v 'set +x'
সিডারকে

উত্তর:


148

আমারও একই সমস্যা ছিল এবং আমি এমন একটি সমাধান খুঁজতে সক্ষম হয়েছি যা সাবসেল ব্যবহার করে না:

set -x
command
{ set +x; } 2>/dev/null

10
দুর্দান্ত উত্তর, কেবল একটি নোট: কমান্ডের পরে কোনও সেমিকোলন ছাড়া এটি কাজ করবে না; এবং একটি সেমিকোলন দিয়ে তবে বন্ধনীগুলির ফাঁকা স্থান ছাড়াই একটি বাক্য গঠন ত্রুটি উত্থাপিত হবে।
sdaau

9
এটি প্রস্থান স্থিতি শূন্য করে।
গার্থ কিড

8
প্রত্যেকটি সফল কমান্ডের সাথে @ গার্থকিড প্রস্থান স্থিতি শূন্য করা হয়েছে। set +xযেমন একটি সফল কমান্ড
ড্যানিয়েল

4
ক্ষেত্রে যেখানে আপনি প্রস্থান অবস্থা প্রয়োজন command, এই প্রকরণ একটি সমাধান পাওয়া যাবে: { STATUS=$?; set +x; } 2>/dev/null। তারপরে $STATUSআপনার অবসর সময়ে পরবর্তী লাইনে পরিদর্শন করুন ।
গ্রেগ দাম

4
আলাদাভাবে, এখানে একটি সংস্করণ সামান্য আরও golfed আছে: { set +x; } 2>&-। এটি / ডিভ / নালকে পয়েন্ট করার পরিবর্তে এফডি 2 বন্ধ করে দেয়। কিছু প্রোগ্রাম স্ট্যাডারগুলিতে মুদ্রণের চেষ্টা করার সময় এটি খুব ভালভাবে পরিচালনা করে না, এ কারণেই / dev / নাল সাধারণত ভাল স্টাইল; তবে শেলের set -xট্রেসিং এটি ঠিকঠাকভাবে পরিচালনা করে, তাই এটি এখানে পুরোপুরি কাজ করে এবং এটি এই প্রসারণটি কিছুটা খাটো করে তোলে।
গ্রেগ দাম

43

আপনি একটি সাব-শেল ব্যবহার করতে পারেন। সাবশেলটি থেকে বেরিয়ে আসার পরে, সেটিংসটি xহারিয়ে যাবে:

( set -x ; command )

ভাল, ধন্যবাদ ... ভাল পয়েন্ট। আসলে আমি "সাব-শেল ট্রিক" সম্পর্কে সচেতন। আমি আশা করি এটি এর চেয়ে সহজতর হতে পারে। এটি কোডকে জটিল এবং কম পাঠযোগ্য করে তোলে বলে কোডে যথেষ্ট পরিবর্তন জড়িত। আইএমএইচও যা সেট + এক্স লাইনের সাথে বেঁচে থাকার চেয়ে খারাপ হবে ...
Andreas Spindler

এর ( set -x \n command \n )চেয়ে খারাপ আর কি করে দেখছি না set -x \n command \n set +x
চিপনার

4
@ চেপারার: ​​আপনি ভেরিয়েবল সেট করতে পারবেন না।
চোরোবা

4
... এবং আপনি পারবেন না cd: এটি প্যারেন্ট শেলের বর্তমান ডিরেক্টরিটি পরিবর্তন করে না।
Andreas Spindler

দুঃখিত, আমি নিশ্চিত না যে আমি আপনার আসল আপত্তিটি কী ভেবেছিলাম। অনেক দিন
কেটে

8

আমি সম্প্রতি এর সমাধান পেয়েছি যখন আমি এতে বিরক্ত হয়ে পড়েছিলাম:

shopt -s expand_aliases
_xtrace() {
    case $1 in
        on) set -x ;;
        off) set +x ;;
    esac
}
alias xtrace='{ _xtrace $(cat); } 2>/dev/null <<<'

এটি আপনাকে নিম্নলিখিত হিসাবে অক্সট্রেস সক্ষম এবং অক্ষম করতে দেয়, যেখানে আমি আর্গুমেন্টগুলি ভেরিয়েবলগুলিতে কীভাবে নির্ধারিত করা হয় তা লগইন করছি:

xtrace on
ARG1=$1
ARG2=$2
xtrace off

এবং আপনি আউটপুট যা দেখতে দেখতে পাবেন:

$ ./script.sh one two
+ ARG1=one
+ ARG2=two

চতুর কৌশল (যদিও আপনার /dev/stdinঅংশটির প্রয়োজন নেই )। সতর্কবাণীটি হ'ল স্ক্রিপ্টগুলিতে ওরফে সম্প্রসারণ চালু করার ফলে অযাচিত পার্শ্ব-প্রতিক্রিয়া হতে পারে।
mklement0

তুমি ঠিক বলছো. অতিমাত্রায় অপসারণ করতে আমি উত্তর সম্পাদনা করেছি /dev/stdin। আমি কোনও নির্দিষ্ট পার্শ্ব প্রতিক্রিয়া সম্পর্কে সচেতন নই, যেহেতু অ-ইন্টারেক্টিভ পরিবেশে কোনও এলিয়াস সংজ্ঞা দেয় এমন কোনও ফাইল লোড করা উচিত নয়। কোন পার্শ্ব প্রতিক্রিয়া হতে পারে?
ব্যবহারকারী 108471

4
এটি একটি ভাল বিষয় - আমি ভুলে গিয়েছিলাম যে উপাধি উত্তরাধিকার সূত্রে প্রাপ্ত হয় না, তাই ঝুঁকিটি আমি যা ভাবি তার চেয়ে অনেক ছোট (অনুমানের সাথে, আপনার স্ক্রিপ্টটি তৃতীয় পক্ষের কোডটি সেরেজ করতে পারে যা এলিয়াসগুলি সংজ্ঞায়িত করতে পারে, তবে আমি সম্মত হলাম এটি সম্ভবত বাস্তব নয়- বিশ্ব উদ্বেগ)। +1
mklement0

4
@ আন্দ্রেসস্পাইন্ডার আপনি কীভাবে এই কৌশলটি আরও সংবেদনশীল তথ্য ফাঁস হওয়ার সম্ভাবনা বেশি ভাবেন বলে আপনি বিশদ বর্ণনা করতে পারেন?
ব্যবহারকারী 108471

4
... মূলত কারণ এলিয়াস এবং ফাংশনগুলি উচ্চ-স্তরের কনস্ট্রাক্ট। set +xআপস করা অনেক কঠিন (যদি অসম্ভব না হয়)। তবে এটি এখনও একটি ভাল এবং সরল সমাধান - সম্ভবত এখন পর্যন্ত সেরা।
আন্দ্রেয়াস স্পিন্ডার

7

@ ব্যবহারকারী 108471 এর সরলীকৃত সংস্করণের উপর ভিত্তি করে একটি সমাধান সম্পর্কে কীভাবে:

shopt -s expand_aliases
alias trace_on='set -x'
alias trace_off='{ set +x; } 2>/dev/null'

trace_on
...stuff...
trace_off

এ কেমন? function () { set_plus_x='{ set +x; } 2>/dev/null' }
লেক্সএইচ

1

এটি এমন কয়েকটি ধারণার সংমিশ্রণ যা কোডের একটি ব্লককে আবদ্ধ করতে পারে এবং প্রস্থান স্থিতিটি সংরক্ষণ করে।

#!/bin/bash
shopt -s expand_aliases
alias trace_on='set -x'
alias trace_off='{ PREV_STATUS=$? ; set +x; } 2>/dev/null; (exit $PREV_STATUS)'

trace_on
echo hello
trace_off
echo "status: $?"

trace_on
(exit 56)
trace_off
echo "status: $?"

মৃত্যুদন্ড কার্যকর করা হলে:

$ ./test.sh 
+ echo hello
hello
status: 0
+ exit 56
status: 56

চমৎকার প্রচেষ্টা কিন্তু আমি মনে করি ()চারপাশের exitপ্রয়োজনীয় নয়। ঠিক আছে. হতে পারে এটি অদ্ভুত, তবে যদি এই কোডটি সাধারণভাবে ব্যবহার করা হয় তবে আপনার একটি ভাল আক্রমণকারী ভেক্টর রয়েছে: এক্সিকিউটড কমান্ডগুলি পড়ার কোডটি পুনরায় সংজ্ঞায়িত trace_onএবং trace_offএবং ইনজেক্ট করুন। আপনি যদি এই জাতীয় "ইউটিলিটিগুলি" একা ব্যবহার করেন তবে এটি শিক্ষণীয়, তবে কোডটি অন্যের সাথে ব্যবহার করা হলে আপনাকে বিবেচনা করতে হবে যে এই জাতীয় মানহীন ক্রিয়াকলাপগুলির সুবিধাগুলি অসুবিধা ছাড়িয়ে যায় কিনা। { set +x; } 2>/dev/nullএই কনস্ট্রাক্টটি সাধারণত বোঝা যায় এবং প্রস্থান স্থিতি পরিবর্তন করে না বলে ব্যক্তিগতভাবে আমি স্থায়ী হয়েছি ।
আন্দ্রেয়াস স্পিন্ডার

ধন্যবাদ আমি আমার সহকর্মীদের সাথে মতামতটি ভাগ করে নিয়েছি এবং তারা পছন্দ করে যে এটি কীভাবে আউটপুট এবং কোড উভয়কে কম শব্দ করে রাখে। ()কাছাকাছি সম্পর্কে exit 56; এটি কেবল তাই ছিল যাতে আমি প্রদর্শিত করতে পারি যে উপপ্রসেসের প্রস্থান স্থিতি বাশ স্ক্রিপ্টে অ্যাক্সেসযোগ্য ছিল; প্যারেন্স না থাকলে এটি সাবপ্রসেসে পরিণত হত না এবং স্ক্রিপ্টটি সেই স্থানে = 65 স্ট্যাটাসের সাথে উপস্থিত থাকতে পারে।
ব্যবহারকারী 3286792
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.