ব্যাশ স্ক্রিপ্টটি চালিত হওয়ার সাথে সাথে কেবলমাত্র কয়েকটি নির্দিষ্ট কমান্ড কীভাবে মুদ্রণ করতে পারি?


19

কমান্ড লাইন আর্গুমেন্টের উপর ভিত্তি করে বিবৃতিগুলি কল করার সময় আমি পাস করি তবে আমার কাছে বিভিন্ন সহ একটি বাশ স্ক্রিপ্ট রয়েছে। কমান্ডগুলি চালিত হচ্ছে সে সম্পর্কে কোনও ধরণের আউটপুট থাকা যদি বিবৃতিগুলির মধ্যে দিয়ে প্রবাহকে নিশ্চিত করতে সহায়তা করে তবে আমার বর্তমান সমাধানটি আমাকে খুব বেশি তথ্য দিচ্ছে ।

ব্যবহার set -vলিপিতে কিছুটা পর্দা হিসাবে তারা স্ক্রিপ্ট চালানোর হয়েছে মুদ্রিত কমান্ড দেখতে সহায়ক ছিল, কিন্তু আমি পেতে খুব অনেক কমান্ড। এটি প্রায় লিপির সম্পূর্ণ কপির মতো।

আমি আউটপুট চাই যা কমান্ডগুলি চালিত হচ্ছে তা দেখায়, তবে আমি মন্তব্যগুলি, নতুন রেখাগুলি, বিবৃতিগুলি যদি বিবরণ ইত্যাদি দেখতে চাই না

প্রিন্ট হওয়ার আগে প্রথমে একটি রেইজেক্সের মাধ্যমে -v বিকল্প দ্বারা উত্পন্ন সমস্ত সম্ভাব্য আউটপুট আমি কীভাবে পাস করতে পারি? বা নির্দিষ্ট কিছু "টাইপ" এর কেবলমাত্র আউটপুট কমান্ডগুলিতে বাশ পাওয়ার জন্য অন্য কিছু সমাধান (যেমন: এক্সিকিউটেবল ব্যবহার করছে এবং কেবলমাত্র নির্দিষ্ট বিবৃতি, মন্তব্য ইত্যাদির বাশ নয়)

[1] /programming/257616/sudo-changes-path- কেন এটিতে বেশ সহায়ক ছিল এবং সেখানেই আমি set -vব্যবহারের জন্য পরামর্শ পেয়েছি ।

সম্পাদনা করুন :

আমি যে চালাচ্ছি তার সাথে একটি অনুরূপ (তবে অভিন্ন নয়) স্ক্রিপ্ট:

#!/bin/bash

#get verbose command output
set -v

env=$1

if [ "$env" == "dev" ]; then
    python ascript.py
fi

if [ "$env" == "prod" ]; then

    #launching in prod will most likely fail if not run as root. Warn user if not running as root.
    if [ $EUID -ne 0 ]; then
        echo "It doesn't look like you're running me as root. This probably won't work. Press any key to continue." > /dev/stderr
        read input
    fi

    #"stop" any existing nginx processes
    pkill -f nginx

    nginx -c `pwd`/conf/artfndr_nginx.conf

fi

আমি এই স্ক্রিপ্ট থেকে আউটপুট লাইনের 2 টি সম্ভাব্য সেট চাই। প্রথম:

python ascript.py

দ্বিতীয়:

pkill -f nginx
nginx -c /some/current/directory/conf/artfndr_nginx.conf

1
অবশ্যই আপনি এটি বিশ্লেষণ করতে পারেন তবে আপনি আমাদের স্ক্রিপ্টটি প্রদর্শন না করে এবং set -vআউটপুটটির কোন অংশটি চান এবং কোনটি না চান তা ব্যাখ্যা না করা আমরা সহায়তা করতে পারি না।
টেরডন

উত্তর:


12

আমি যখন আরও জটিল বাশ স্ক্রিপ্টগুলি লিখি, তখন আমি কমান্ডগুলি চালানোর জন্য একটি সামান্য ফাংশন ব্যবহার করি যা একটি লগফাইলে চালিত কমান্ডগুলিও মুদ্রণ করে:

runthis(){
    ## print the command to the logfile
    echo "$@" >> $LOG
    ## run the command and redirect it's error output
    ## to the logfile
    eval "$@" 2>> $LOG 
}

তারপরে, আমার স্ক্রিপ্টে, আমি এই জাতীয় আদেশগুলি চালিত করি:

runthis "cp /foo/bar /baz/"

আপনি যদি কোনও কমান্ড মুদ্রিত না চান তবে কেবল এটি স্বাভাবিকভাবে চালান।

আপনি হয় $LOGকোনও ফাইলনামে সেট করতে পারেন বা কেবল এটি সরিয়ে স্টাডআউট বা স্টার্ডারে মুদ্রণ করতে পারেন।


+1 এছাড়াও আমি এটিকে আমার স্ক্রিপ্টের ভিতরে ফাংশনটির একটি স্বল্প-নামযুক্ত সংস্করণ সহ "গুরুত্বপূর্ণ" কমান্ডগুলি প্রিপেন্ড করে চালাতে সক্ষম হয়েছি, সুতরাং লাইনগুলি v python ascript.pyকোটেশনগুলিতে আবদ্ধ না হয়ে এবং আমার
ভিএম

@ ত্রিঞ্জাজ যখন আপনার কমান্ডগুলিতে ভেরিয়েবলগুলি পাস করার প্রয়োজন হয় তখন ভেরিয়েবলগুলিতে স্পেস থাকলে অন্যথায় আপনার সমস্যা হতে পারে for
টেরডন

eval ..... || ok=1: "1" "ঠিক আছে" তখনই "ইভাল ..." ব্যর্থ হবে ?? সম্ভবত আপনি "&&" বোঝাতে চেয়েছিলেন? এবং যদি আপনি বোঝাতে চেয়েছিলেন তবে এভাল লাইনের আগে একটি "Ok = 0" যুক্ত করুন, সুতরাং এটি প্রতিবার "রিসেট" হবে। অথবা কেবল "ত্রুটি" এর "Ok" নাম পরিবর্তন করবেন? মনে হচ্ছে এখানেই বোঝানো হয়েছিল। সুতরাং শেষ পর্যন্ত:eval "$@" 2>> "$LOG" && error=0 || error=1
অলিভিয়ার ডুলাক

@ অলিভিয়ারডুলাক, আমি যে সংস্করণটি ব্যবহার করি তার সংস্করণে আমার একটি okভেরিয়েবল রয়েছে যা কোনও কমান্ড ব্যর্থ হলে স্ক্রিপ্টটি বন্ধ করে দেবে। যেহেতু এটি এখানে প্রাসঙ্গিক নয়, তাই আমি এটি সরিয়ে দিয়েছি তবে এটিকে মুছতে ভুলে গিয়েছি || ok=1। ধন্যবাদ, এখনই স্থির।
টেরডন

দুর্দান্ত সমাধান! আমাকে "চারপাশে স্পষ্ট বিবৃতিটি সরিয়ে ফেলতে হয়েছিল , কারণ কমান্ডটি ইতিমধ্যে "এস
gromit190

11

একটি সাব-শেল ব্যবহার করুন, অর্থাত:

( set -x; cmd1; cmd2 )

উদাহরণ স্বরূপ:

( set -x; echo "hi there" )

কপি করে প্রিন্ট

+ echo 'hi there'
hi there

আমি set -x; cmd; set +xবেশ কয়েকটি কারণে এই এক ওভার পছন্দ । প্রথমত, এটি set -xআগে চালু থাকলে সেটি পুনরায় সেট হয় না । দ্বিতীয়ত, স্ক্রিপ্টটির অভ্যন্তরীণ সমাপ্তি হ'ল ভার্বোজ সেটিংস সহ ফাঁদগুলি কার্যকর হয় না।
অলিভার গন্ডিয়া

2

আমি @ টেরডনের অনুরূপ পদ্ধতিগুলি দেখেছি। এটি উচ্চ স্তরের প্রোগ্রামিং ভাষাগুলি লগারকে কল করে এবং লোগো 4 জে (জাভা), লগ 4 পার্ল (পার্ল) ইত্যাদির মতো সম্পূর্ণ প্রস্ফুটিত গ্রন্থাগার হিসাবে অফার করার সূচনা It's

আপনি set -xযেমন উল্লেখ করেছেন তেমন কিছু ব্যবহার করতে পারেন তবে আপনি এটির সাথে কোডের ব্লকগুলি মোড়ানো রেখে ডিবাগিংটি কেবলমাত্র কমান্ডের একটি উপসেট চালু করতে ব্যবহার করতে পারেন।

$ set -x; cmd1; cmd2; set +x

উদাহরণ

এখানে আপনি ব্যবহার করতে পারেন এমন একটি লাইন প্যাটার্ন's

$ set -x; echo  "hi" ;set +x
+ echo hi
hi
+ set +x

স্ক্রিপ্টে একাধিক কমান্ডের জন্য আপনি এগুলি তাদের মতো মোড়ানো করতে পারেন।

set -x
cmd1
cmd2
set +x

cmd3

Log4Bash

অধিকাংশ মানুষ অন্যমনস্ক কিন্তু ব্যাশ হিসাবে ভাল একটি log4 * আছে, Log4Bash । আপনার যদি আরও পরিমিত চাহিদা থাকে তবে এটি সেট আপ করার জন্য এটি উপযুক্ত সময় হতে পারে।

লগ 4 ব্যাশ ব্যাশ স্ক্রিপ্টগুলির জন্য আরও ভাল লগিং করার একটি প্রচেষ্টা (যেমন বাশ-এ লগিং কম চুষিয়ে নিন)।

উদাহরণ

এখানে লগ 4 ব্যাশ ব্যবহারের কয়েকটি উদাহরণ রয়েছে।

#!/usr/bin/env bash
source log4bash.sh

log "This is regular log message... log and log_info do the same thing";

log_warning "Luke ... you turned off your targeting computer";
log_info "I have you now!";
log_success "You're all clear kid, now let's blow this thing and go home.";
log_error "One thing's for sure, we're all gonna be a lot thinner.";

# If you have figlet installed -- you'll see some big letters on the screen!
log_captains "What was in the captain's toilet?";

# If you have the "say" command (e.g. on a Mac)
log_speak "Resistance is futile";

Log4sh

আপনি যদি চান যা আমি লগ 4 * ফ্রেমওয়ার্কের সম্পূর্ণ পাওয়ার হিসাবে আরও শ্রেণিবদ্ধ করব তবে আমি লগ 4 শকে চেষ্টা করে দেখি

উদ্ধৃতাংশ

লগ 4শ মূলত একটি লগিং সমস্যা সমাধানের জন্য তৈরি হয়েছিল যেখানে আমি যে কয়েকটি উত্পাদন পরিবেশে কাজ করেছিলাম যেখানে আমার খুব বেশি লগিং ছিল, বা পর্যাপ্ত নয়। বিশেষত ক্রোন জব আমাকে তাদের ধ্রুবক এবং বিরক্তিকর ইমেলগুলি দিয়ে আমাকে সবচেয়ে মাথা ব্যথার কারণ হিসাবে জানিয়েছে যে সবকিছুই কাজ করে, বা কিছুই কিছুই কাজ করে না তবে এর কারণ কারণ নয়। আমি এখন এমন পরিবেশগুলিতে লগ 4শ ব্যবহার করি যেখানে শেল স্ক্রিপ্টগুলি থেকে লগিং সমালোচনা হয় তবে যেখানে আমার কেবল একটি সহজ "হ্যালো, আমাকে ঠিক করুন!" লগিং বার্তা প্রকার। আপনি যা দেখতে চান তা যদি পছন্দ করেন বা উন্নতির বিষয়ে কোনও পরামর্শ থেকে থাকেন তবে দয়া করে আমাকে ইমেল ছাড়াই নির্দ্বিধায়। প্রকল্পে যথেষ্ট আগ্রহ থাকলে আমি এটি আরও বিকাশ করব।

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

লগ 4 শ্যাশ কেবলমাত্র বাশকে নয়, বেশ কয়েকটি শেল সমর্থন করে।

  • বোর্ন শেল (শ)
  • বেস - জিএনইউ বোর্ন অ্যাগেইন শেল (বাশ)
  • ড্যাশ (ড্যাশ)
  • কর্ন শেল (কেএসএল)
  • pdksh - পাবলিক ডোমেন কার্ন শেল (pdksh)

এটি কেবল লিনাক্স নয়, বেশ কয়েকটি ওএসেও পরীক্ষা করা হয়েছে।

  • সাইগউইন (উইন্ডোজ অধীনে)
  • ফ্রিবিএসডি (ব্যবহারকারী সমর্থিত)
  • লিনাক্স (জেন্টু, রেডহ্যাট, উবুন্টু)
  • ম্যাক ওএস এক্স
  • সোলারিস 8, 9, 10

লগ 4 * ফ্রেমওয়ার্কটি ব্যবহার করতে শিখতে কিছুটা সময় লাগবে তবে আপনার লগিং থেকে আরও চাহিদা থাকা প্রয়োজন থাকলে এটি উপযুক্ত। লগ 4শ একটি কনফিগারেশন ফাইল ব্যবহার করে যেখানে আপনি অ্যাপেন্ডারদের সংজ্ঞায়িত করতে পারেন এবং প্রদর্শিত হবে এমন আউটপুটের জন্য বিন্যাস নিয়ন্ত্রণ করতে পারেন।

উদাহরণ

#! /bin/sh
#
# log4sh example: Hello, world
#

# load log4sh (disabling properties file warning) and clear the default
# configuration
LOG4SH_CONFIGURATION='none' . ./log4sh
log4sh_resetConfiguration

# set the global logging level to INFO
logger_setLevel INFO

# add and configure a FileAppender that outputs to STDERR, and activate the
# configuration
logger_addAppender stderr
appender_setType stderr FileAppender
appender_file_setFile stderr STDERR
appender_activateOptions stderr

# say Hello to the world
logger_info 'Hello, world'

এখন যখন আমি এটি চালাব:

$ ./log4sh.bash 
INFO - Hello, world

দ্রষ্টব্য: উপরের কোডের অংশ হিসাবে অ্যাপেন্ডারকে কনফিগার করে। আপনি যদি এটি পছন্দ করেন তবে এটির নিজস্ব ফাইল log4sh.propertiesইত্যাদিতে বের করা যেতে পারে etc.

আপনার আরও বিশদ বিবরণ প্রয়োজন হলে লগ 4 শ এর জন্য দুর্দান্ত ডকুমেন্টেশনের সাথে পরামর্শ করুন।


যোগ করা নোটগুলির জন্য ধন্যবাদ, তবে তার সাথে আমার যে প্রধান সমস্যাটি রয়েছে তা হ'ল আমার সমস্ত setকমান্ডগুলি প্রবর্তন করা দরকার, মন্তব্যগুলি ঘুরিয়ে দেওয়া ইত্যাদি, সুতরাং আমার স্ক্রিপ্টের শীর্ষে একটি ক্রিয়াকলাপ থাকবে যার সাথে একটি একক চরিত্র ফাংশন কল প্রিপেন্ড করা হয়েছে with স্ক্রিপ্টের সমস্ত "গুরুত্বপূর্ণ" লাইনগুলি আপাতত আমার নিকটবর্তী বলে মনে হয়েছিল। (একক অক্ষর কারণ ফাংশনটির একটি একক চরিত্রের নাম রয়েছে)
ত্রিনদাজ

@ ত্রিঞ্জাজ - দুঃখিত আমি এখনও আমার উত্তরটি শেষ করিনি। লর্ড 4 ব্যাশটি একবার দেখুন যদি আপনার আরও প্রয়োজন থাকে যে টর্ডন যে ফাংশনটি দিয়েছে।
slm

1
@ ত্রিঞ্জাজ - আমি সময়ে সময়ে একই রকম কাজ করি, অন্য যে পদ্ধতিটি আমি ব্যবহার করেছি তা হ'ল echoআমার নিজস্ব ফাংশনটি গুছিয়ে ফেলা mecho, এবং তারপরে -vআমি যখন জিনিসগুলি বন্ধ করতে চাই তখন ভার্বোজের জন্য ডাকা প্রোগ্রামটিতে একটি সুইচ পাস করি pass আমি এটি একটি দ্বিতীয় আর্গুমেন্ট স্যুইচ দিয়েও এটি নিয়ন্ত্রণ করতে পারি যা ফাংশনের নাম নির্দিষ্ট করে, তাই লগিংটি নিয়ন্ত্রণ করতে আমার 2 অক্ষ রয়েছে। যদিও প্রায়শই লগ 4 ব্যাশ চাওয়ার প্রবেশদ্বার এটি।
slm

1
@ ত্রিঞ্জাজ set -xকমান্ডগুলি কার্যকর করার সাথে সাথে মুদ্রণ করে। এটি মন্তব্য মুদ্রণ করে না। set -xডিবাগিংয়ের জন্য ব্যবহারিক (এর বিপরীতে set -vযা খুব কার্যকর নয়)। জ্যাশের বাশের set -xচেয়ে ভাল আউটপুট রয়েছে , উদাহরণস্বরূপ এটি বর্তমানে কোন ফাংশনটি কার্যকর করা হচ্ছে এবং উত্স লাইন নম্বরটি এটি দেখায়।
গিলস 15:39-

ধন্যবাদ @ গিলস এটি সত্য, তবে এটি আমাকে এই অভিব্যক্তিটির বিস্তৃতি দিয়েছে, যা
এক্ষেত্রে অতিরিক্ত

1

আপনি পারে trap DEBUGএবং তারপর পরীক্ষা পরিবর্তনশীল । স্ক্রিপ্টের শীর্ষে এটি যুক্ত করুন:BASH_COMMAND

log() {
    case "$1" in
        python\ *)
            ;&
        pkill\ *)
            printf "%s\n" "$*"
            ;;
    esac
}

trap 'log "$BASH_COMMAND"' DEBUG

কোডটি পাঠযোগ্য; এটি প্রথম পরীক্ষার সাথে শুরু হয় pythonবা এটি পরীক্ষা করে pkillএবং প্রিন্ট করে যদি এটি হয় pr এবং ট্র্যাপটি BASH_COMMANDপ্রথম আর্গুমেন্ট হিসাবে ব্যবহার করে (এতে যে আদেশটি কার্যকর করা হবে) uses

$ bash foo.sh dev
python ascript.py
python: can't open file 'ascript.py': [Errno 2] No such file or directory
$ bash foo.sh prod
It doesn't look like you're running me as root. This probably won't work. Press any key to continue.

pkill -f nginx
foo.sh: line 32: nginx: command not found

নোট করুন যে caseগ্লোবগুলি ব্যবহার করার সময় আপনি ঠিক তেমন সহজেই করতে পারেন:

if [[ $1 =~ python|nginx ]]
then
    printf "%s" "$*"
fi

এবং নিয়মিত এক্সপ্রেশন ব্যবহার করুন।


0

এটি স্টিভেন পেনির ঝরঝরে কাজটির একটি সংশোধিত সংস্করণ। এটি এর আর্গুমেন্টগুলি রঙে মুদ্রণ করে এবং প্রয়োজনীয় হিসাবে সেগুলি উদ্ধৃত করে। আপনি যে কমান্ডগুলি ট্রেস করতে চান তা নির্বাচনী প্রতিধ্বনি করতে এটি ব্যবহার করুন। যেহেতু উদ্ধৃতিগুলি আউটপুট, আপনি কোনও স্ক্রিপ্ট ডিবাগ করার সময় আপনি মুদ্রিত রেখাগুলি অনুলিপি করতে এবং তাড়াতাড়ি পুনরায় প্রয়োগের জন্য টার্মিনালে এঁকে দিতে পারেন। আমি কী পরিবর্তন করেছি এবং কেন তা জানতে প্রথম মন্তব্যটি পড়ুন।

xc() # $@-args
{
  cecho "$@"
  "$@"
}
cecho() # $@-args
{
  awk '
  BEGIN {
    x = "\047"
    printf "\033[36m"
    while (++i < ARGC) {
      if (! (y = split(ARGV[i], z, x))) {
        printf (x x)
      } else {
        for (j = 1; j <= y; j++) {
          printf "%s", z[j] ~ /[^[:alnum:]%+,./:=@_-]/ ? (x z[j] x) : z[j]
          if (j < y) printf "\\" x
        }
      }
      printf i == ARGC - 1 ? "\033[m\n" : FS
    }
  }
  ' "$@"
}

আউটপুট সহ ব্যবহারের উদাহরণ:

# xc echo "a b" "c'd" "'" '"' "fg" '' " " "" \# this line prints in green

echo 'a b' c\'d \' '"' fg '' ' ' '' '#' this line prints in green

a b c'd ' " fg # this line prints in green

উপরের দ্বিতীয় লাইনটি সবুজতে মুদ্রণ করে এবং তৃতীয় লাইনের পুনরুত্পাদন করতে কপি-পেস্ট করা যায় can

আরও মন্তব্য

@ স্টিভেন-পেনির মূল এক্সসি চালাক এবং এটির জন্য তিনি সমস্ত কৃতিত্বের অধিকারী। যাইহোক, আমি কয়েকটি সমস্যা লক্ষ্য করেছি, তবে আমি তাঁর পোস্টটিতে সরাসরি মন্তব্য করতে পারিনি কারণ আমার যথেষ্ট খ্যাতি নেই। সুতরাং আমি তার পোস্টে একটি প্রস্তাবিত সম্পাদনা করেছি তবে পর্যালোচকরা আমার সম্পাদনা প্রত্যাখ্যান করেছেন। তাই আমি এই মন্তব্য হিসাবে আমার মন্তব্য পোস্ট করার আশ্রয় নিয়েছি, যদিও আমি স্টিভ পেনি এর নিজস্ব উত্তর সম্পাদনা করতে সক্ষম হতে চাইতাম।

যা আমি বদলেছিলাম স্টিভেন-পেনির উত্তর

স্থির: নাল স্ট্রিং মুদ্রণ - সেগুলি মুদ্রিত হয়নি। ফিক্সড: মুদ্রণের স্ট্রিংগুলি এতে অন্তর্ভুক্ত রয়েছে %- যার ফলে তারা বিশ্রী সিন্ট্যাক্স ত্রুটি ঘটায়। এর সাথে প্রতিস্থাপন for (j in ...)করা হয়েছে for (j = 0, ...)কারণ প্রাক্তন অ্যারে ট্র্যাভারসাল ক্রমের গ্যারান্টি দেয় না (এটি অবিকল বাস্তবায়ন-নির্ভর)। বহনযোগ্যতার জন্য 0 টি অক্টাল সংখ্যায় যুক্ত হয়েছে।

হালনাগাদ

স্টিভেন পেনি তার উত্তরগুলি পরে এই বিষয়গুলি স্থির করেছে, সুতরাং এই মন্তব্যগুলি কেবল আমার উত্তরের recordতিহাসিক রেকর্ডের জন্য রয়ে গেছে। আরও তথ্যের জন্য মন্তব্য বিভাগ দেখুন।


0

আপনি "sh_trace" শেল ফাংশনটি POSIX stdlib লাইব্রেরি থেকে চালানোর আগে রঙটি কমান্ড প্রিন্ট করতে ব্যবহার করতে পারেন । উদাহরণ:

প্রিভিউ

অন্তর্নিহিত আওক ফাংশন:

function sh_trace(ary,   b, d, k, q, w, z) {
  b = "\47"
  for (d in ary) {
    k = split(ary[d], q, b)
    q[1]
    if (d - 1)
      z = z " "
    for (w in q) {
      z = z (!k || q[w] ~ "[^[:alnum:]%+,./:=@_-]" ? b q[w] b : q[w]) \
      (w < k ? "\\" b : "")
    }
  }
  printf "\33[36m%s\33[m\n", z
  system(z)
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.