आउटपुट फ़ाइल में कमांड शामिल करें?


17

भ्रामक शीर्षक के लिए क्षमा करें!

मान लो मैं दौड़ता हूँ

apt-cache depends kde-window-manager > ~/Desktop/kwin-depends

मुझे अपने डेस्कटॉप फ़ोल्डर में "केविन-निर्भर" नाम की एक फ़ाइल मिलेगी।

क्या फ़ाइल के हिस्से के रूप में जारी की गई कमांड को शामिल करने के लिए कुछ ट्रिक है, अधिमानतः फ़ाइल के शुरू में?

तो, कम से कम 14.04 एलटीएस में, पहली कुछ लाइनें इस तरह दिखेंगी:

apt-cache depends kde-window-manager > ~/Desktop/kwin-depends

kde-window-manager
  Depends: kde-runtime
  Depends: libc6
 |Depends: libegl1-mesa
  Depends: <libegl1-x11>

इसके बजाय बस इस तरह:

kde-window-manager
  Depends: kde-runtime
  Depends: libc6
 |Depends: libegl1-mesa
  Depends: <libegl1-x11>

3
जैसा कि अब कई अन्य अच्छे और लचीले समाधान हैं, आपको शायद उस उत्तर को अस्वीकार करने पर विचार करना चाहिए जो मैन्युअल रूप से फाइल को दो बार टाइप करके कमांड लिखने का सुझाव देता है और इसके बजाय बहुमुखी समाधानों में से एक को स्वीकार करता है।
बाइट कमांडर

जवाबों:


18

मैं बस एक साधारण फ़ंक्शन का उपयोग करूंगा। इसे अपनी ~/.bashrcफ़ाइल में जोड़ें :

function runcom(){
    echo "$@"
    ## Run the command
    $@
}

अब, जब भी आप एक कमांड चलाना चाहते हैं और प्रिंट करना चाहते हैं, आप कर सकते हैं:

runcom apt-cache depends kde-window-manager > out

ऊपर इस फ़ाइल का उत्पादन:

$ cat out
apt-cache depends kde-window-manager
kde-window-manager
  Depends: perl
  Depends: kde-runtime
  Depends: kde-style-oxygen
  Depends: libc6
 |Depends: libegl1-mesa
  Depends: <libegl1-x11>
    libegl1-mesa
  Depends: libgcc1
 |Depends: libgl1-mesa-glx
  Depends: <libgl1>
    libgl1-mesa-swx11
    libgl1-mesa-glx
 |Depends: libgles2-mesa
  Depends: <libgles2>
    libgles2-mesa
  Depends: libice6
  Depends: libkactivities6
  Depends: libkcmutils4
  Depends: libkdeclarative5
  Depends: libkdecorations4abi2
  Depends: libkdecore5
  Depends: libkdeui5
  Depends: libkio5
  Depends: libknewstuff3-4
  Depends: libkwineffects1abi5
  Depends: libkwinglesutils1
  Depends: libkwinglutils1abi2
  Depends: libkworkspace4abi2
  Depends: libplasma3
  Depends: libqt4-dbus
  Depends: libqt4-declarative
  Depends: libqt4-script
  Depends: libqtcore4
  Depends: libqtgui4
  Depends: libsm6
  Depends: libstdc++6
  Depends: libwayland-client0
 |Depends: libwayland-egl1-mesa
  Depends: <libwayland-egl1>
    libwayland-egl1-mesa
  Depends: libx11-6
  Depends: libx11-xcb1
  Depends: libxcb-composite0
  Depends: libxcb-damage0
  Depends: libxcb-image0
  Depends: libxcb-keysyms1
  Depends: libxcb-randr0
  Depends: libxcb-render0
  Depends: libxcb-shape0
  Depends: libxcb-shm0
  Depends: libxcb-sync1
  Depends: libxcb-xfixes0
  Depends: libxcb-xtest0
  Depends: libxcb1
  Depends: libxcursor1
  Depends: libxext6
  Depends: libxrandr2
  Depends: libxxf86vm1
  Breaks: kde-style-bespin
  Breaks: kde-style-bespin:i386
  Breaks: <kde-style-skulpture>
  Breaks: <kde-style-skulpture:i386>
  Breaks: kde-workspace-data
  Breaks: <kde-workspace-data:i386>
  Breaks: kdeartwork-theme-window
  Breaks: kdeartwork-theme-window:i386
  Breaks: <kdebase-workspace-data>
  Breaks: <kdebase-workspace-data:i386>
  Breaks: kwin-style-crystal
  Breaks: kwin-style-crystal:i386
  Breaks: kwin-style-dekorator
  Breaks: kwin-style-dekorator:i386
  Breaks: kwin-style-qtcurve
  Breaks: kwin-style-qtcurve:i386
  Replaces: kde-workspace-data
  Replaces: <kde-workspace-data:i386>
  Replaces: <kdebase-workspace-data>
  Replaces: <kdebase-workspace-data:i386>
  Conflicts: kde-window-manager:i386

मेरा मतलब यहां गोलपोस्ट को स्थानांतरित करने से नहीं है, लेकिन क्या अलाइज़ को स्वीकार करने के लिए आपका कोड प्राप्त करने का कोई तरीका है? उदाहरण के लिए, यदि मैं उर्फ apt-cache dependsकरता हूं, तो मुझे acd"नो कमांड 'एसीडी' मिलता है, क्या आपका मतलब है: ..." जब मैं दौड़ता हूं runcom acd leafpad > out
डीके बोस

@DKBose उपनामों को .bashrc फ़ाइल में परिभाषित किया गया है, शेल में नहीं, और फ़ंक्शंस केवल बाइनरी फ़ाइलों को कहते हैं जो $ PATH चर के तहत स्थित हैं। लेकिन आप एक आसान ट्रिक कर सकते हैं। उदाहरण के लिए, वास्तविकता में lsअलियास किया ls --color=auto'जाता है। आप क्या कर सकते हैं (जब तक कि आपके उपनाम में कोई एकल उद्धरण या दोहरा उद्धरण नहीं है), यह है $ terdonsFunction $(alias ls | awk -F '=' '{$1="";print}'| tr "'" " ") :।
सर्गी कोलोडियाज़नी

या अपनी कमांड को एक चर में बदल दें। जैसे मैंने पहले अपने जवाब में दिखाया था। MYCOMMAND="apt-cache depends"; terdonsFunction $MYCOMMAND leafpad > out.txt
सर्गी कोलोडियाज़नी

@ शेर, GARCIN डेविड का जवाब देखें: askubuntu.com/a/688936/248158
DK

यह "स्पष्ट" उत्तर है और महान काम करता है जब तक कि किसी भी तर्क में कोड शामिल नहीं है जो निष्पादित करता है और इसके साइड इफेक्ट होते हैं जो जमा हो सकते हैं। यह एक एज केस है, इसलिए यह बहुत बार नहीं होता।
जो

11

तुम कर सकते हो:

tee file.txt <<<'apt-cache depends kde-window-manager' | bash >>file.txt

echoयहाँ स्ट्रिंग्स ( <<<) के बजाय एक ही चीज़ का उपयोग करना :

echo 'apt-cache depends kde-window-manager' | tee file.txt | bash >>file.txt
  • tee STDOUT को लिखेंगे और फाइल को भी file.txt

  • की STDOUT teeयानी apt-cache depends kde-window-managerको खिलाया जा जाएगा bashआदेश चलाने के लिए और करने के लिए STDOUT संलग्न करने के लिए file.txt

उदाहरण:

$ echo 'apt-cache depends kde-window-manager' | tee file.txt | bash >>file.txt

$ cat file.txt 
apt-cache depends kde-window-manager
kde-window-manager
  Depends: kde-runtime
  Depends: libc6
 |Depends: libegl1-mesa
  Depends: <libegl1-x11>

1
बहुत बढ़िया जवाब! सरल और सटीक! मैं एक के साथ कोशिश कर रहा था, teeलेकिन मेरा असफल रहा। बहुत बढ़िया! +1
टेरेंस

@ सेठ ने मुझे फ़ाइल डिस्क्रिप्टर के साथ खेलने के बारे में भी सोचा है लेकिन teeसाफ-सुथरा लगता है :)
heemayl

11

सबसे न्यूनतर - दृष्टिकोण # 4 और # 3, दोनों को फ़ंक्शन में परिवर्तित किया जा सकता है; # 2 मेरा पसंदीदा - awk। # 1 scriptकमांड का उपयोग करता है - बहुत बहुमुखी उपकरण, सामान्य रूप से रिकॉर्डिंग कमांड लाइन के लिए उपयोगी; कहीं भी लागू हो, जो भी आप रिकॉर्ड करना चाहते हैं।

दृष्टिकोण # 1:/usr/bin/script कमांड-लाइन आउटपुट रिकॉर्ड करने के लिए एक कमांड (जो डिफ़ॉल्ट रूप से ubuntu के साथ आता है), जो प्रॉम्प्ट और कमांड के साथ, सब कुछ कैप्चर करता है। केवल एक कमांड और इसके आउटपुट को विशिष्ट फ़ाइल में सहेजने के लिए, -cध्वज का उपयोग करें और आउटपुट फ़ाइल निर्दिष्ट करें। उदाहरण

xieerqi:$ script -c 'apt-cache depends gnome-terminal' outputFile.txt
Script started, file is outputFile.txt
gnome-terminal
  Depends: gconf-service
    gconf-service:i386
  Depends: libatk1.0-0
  Depends: libc6
  Depends: libgconf-2-4
  Depends: libgdk-pixbuf2.0-0
     (extra output omitted)
Script done, file is outputFile.txt

xieerqi:$ cat outputFile.txt                                              
Script started on 20151022 星期四 085846
gnome-terminal
  Depends: gconf-service
    gconf-service:i386
  Depends: libatk1.0-0
  Depends: libc6
  Depends: libgconf-2-4
  (extra output omitted)

Script done on 20151022 星期四 085846

दृष्टिकोण # 2: जाग हैकरी

Awk में system()फ़ंक्शन होता है जो आपको स्क्रिप्ट या कमांड सेawk शेल कमांड चलाने की अनुमति देता है । आउटपुट स्क्रीन पर दिखाई देगा, पहले कमांड, आउटपुट अगला। एक फ़ाइल उपयोग >ऑपरेटर को जो आप देखते हैं उसे पुनर्निर्देशित करने के लिए ।

यह दो तरीकों से किया जा सकता है - उपयोगकर्ता को स्टड से इनपुट करने के लिए या कमांड लाइन तर्क के रूप में पूछें। पहले एक हासिल करना आसान है, इसलिए यह पोस्ट करना।

(1) awk 'BEGIN{ print "Enter command to run: "; getline com < "/dev/stdin"; system(com) }'

 awk 'BEGIN{ print "Enter command to run: "; getline com < "/dev/stdin"; system(com) }'
Enter command to run: 
apt-cache depends gnome-terminal
gnome-terminal
  Depends: gconf-service
    gconf-service:i386
  Depends: libatk1.0-0
  Depends: libc6
  Depends: libgconf-2-4
  Depends: libgdk-pixbuf2.0-0
  Depends: libglib2.0-0 
  (extra output omitted)

(2) कमांड लाइन संस्करण args; बहुत लंबे समय तक उत्तर देने से बचने के लिए आउटपुट शामिल नहीं है। फिर से, >फ़ाइल में रीडायरेक्ट करने की अपील करें

awk 'BEGIN{for (i=1; i<= ARGC; i++) myString = myString"  "ARGV[i]; print myString; system(myString)  }' apt-cache depends gnome-terminal

दृष्टिकोण # 3: बैश को आपके लिए काम करने के लिए कहें

xieerqi@eagle:~$ bash -c ' MYCOMMAND="apt-cache depends gnome-terminal"; echo $MYCOMMAND ; $MYCOMMAND    '
apt-cache depends gnome-terminal
gnome-terminal
  Depends: gconf-service
    gconf-service:i386
  Depends: libatk1.0-0
  Depends: libc6
  Depends: libgconf-2-4
  Depends: libgdk-pixbuf2.0-0
  Depends: libglib2.0-0

>ऑपरेटर के साथ फाइल करने के लिए पुनर्निर्देशित करें :

bash -c ' MYCOMMAND="apt-cache depends gnome-terminal"; echo $MYCOMMAND ; $MYCOMMAND ' > output.txt

दृष्टिकोण # 4: (मेरा दूसरा पसंदीदा)

ByteCommander के पोस्ट से प्रेरित; हम उपयोग कर सकते हैं readऔर फिर सबस्क्रिप्शन में आवश्यक कमांड चला सकते हैं

read command && (printf "COMMAND: %s" "$command";printf "\n+++++++\n"; sh -c "$command")

नमूना रन:

xieerqi:$ read command && (printf "COMMAND READ: %s" "$command";printf "\n+++++++\nOUTPUT\n"; sh -c "$command")                                       
printf "This was a triumph; I'm making a note here - huge success"
COMMAND READ: printf "This was a triumph; I'm making a note here - huge success"
+++++++
OUTPUT
This was a triumph; I'm making a note here - huge success

दृष्टिकोण # 5:

के माध्यम से तर्क प्रदान करने के लिए उपयोग ( echoया here stringउर्फ <<< "string")sh -cxargs

xieerqi:$ echo "apt-cache policy gnome-terminal" | xargs -I {} bash -c 'echo {}; {}'                                                            
apt-cache policy gnome-terminal
gnome-terminal:
  Installed: 3.6.2-0ubuntu1
  Candidate: 3.6.2-0ubuntu1
  Version table:
 *** 3.6.2-0ubuntu1 0
        500 http://us.archive.ubuntu.com/ubuntu/ trusty/main amd64 Packages
        100 /var/lib/dpkg/status

और यदि आप चाहें, तो आप इसी चाल का उपयोग उपनाम के साथ कर सकते हैं:

xieerqi:$ printAndRun <<< "apt-cache policy gnome-terminal"                                                                                     
apt-cache policy gnome-terminal
gnome-terminal:
  Installed: 3.6.2-0ubuntu1
  Candidate: 3.6.2-0ubuntu1
  Version table:
 *** 3.6.2-0ubuntu1 0
        500 http://us.archive.ubuntu.com/ubuntu/ trusty/main amd64 Packages
        100 /var/lib/dpkg/status

xieerqi:$ type printAndRun
printAndRun is an alias for 'xargs -I {} bash -c "echo {}; {}"'

अच्छा लगा, लेकिन इसमें वह कमांड शामिल नहीं है जिस तरह से Arronical का कोड करता है।
डीके बोस

@DKBose मैं एक और दृष्टिकोण जोड़ूंगा जिसमें कमांड शामिल होगी। पाँच मिनट
सर्गी कोलोडियाज़नी

@DKBose मेरा दृष्टिकोण # 2 कैसे है?
सेर्गेई कोलोडियाज़नी

वह चतुर है, awkवास्तव में वह एक बहुत ही विन्यास योग्य छोटी बेला नहीं है! `स्क्रिप्ट कुछ अन्य उपयोगों के लिए भी आसान लगती है।
आर्कटिक

1
यह सबसे अच्छा जवाब है क्योंकि स्क्रिप्ट का उपयोग तर्क से किसी भी दुष्प्रभाव से बचा जाता है, जो इको के साथ प्रदर्शित होने पर कोड निष्पादित कर सकता है, आदि - दूसरा, इरादा, निष्पादन संभवतः अलग-अलग परिणाम देता है अगर कमांड अलग से चलाया जाता था।
जो

6
  1. शुरू script -q outputfile
  2. अपनी आज्ञा का पालन करें
  3. प्रेस Ctrl-D
  4. फ़ाइल खोलें outputfile

उदाहरण

शुरू script

[aboettger:~/tmp] % script -q ~/Desktop/kwin-depends

अपनी आज्ञा शुरू करो

[aboettger:~/tmp] % apt-cache depends kde-window-manager
<kde-window-manager>
[aboettger:~/tmp] % 

प्रेस Ctrl-D

Script done, file is /home/aboettger/Desktop/kwin-depends

अपना कमांड और आउटपुट दिखाएं

[aboettger:~/tmp] % cat ~/Desktop/kwin-depends

और आप कुछ इस तरह देखेंगे

[aboettger:~/tmp] % apt-cache depends kde-window-manager
<kde-window-manager>

5

यदि आप उर्फ ​​विस्तार चाहते हैं (केवल बैश करें) आप इसे इस तरह से कर सकते हैं:

function runcmd
{
    local check_cmd=${BASH_ALIASES[$1]}

    if [ -z "$check_cmd" ]; then
        check_cmd=$1
    fi

    shift #skip 1st arg

    echo "$check_cmd $@"
    $check_cmd $@
}

अब आप चला सकते हैं

runcmd acd leafpad > out

4

एक आसान तरीका हो सकता है, लेकिन आप इसे एक स्क्रिप्ट द्वारा कर सकते हैं:

#!/bin/sh
echo $1
apt-cache depends $1

scriptअपने होम फ़ोल्डर में इस सामग्री के साथ एक फ़ाइल बनाएं और निष्पादन की अनुमति दें

chmod +x script

इसे इस तरह से चलाएं:

./script kde-window-manager > ~/Desktop/kwin-depends

यदि आप चाहते हैं तो बाद में उस कमांड लाइन को दोहराना आसान बनाने के लिए इस दृष्टिकोण का लाभ है! आप स्क्रिप्ट में रीडायरेक्शन भी लिख सकते हैं, ताकि script.shहमेशा script.logउसके आउटपुट के साथ एक फ़ाइल बनाई जाए।
गौरव

4

एक-लाइन बैश फ़ंक्शन का उपयोग करके अत्यधिक सरल समाधान

तैयारी:

यह दृष्टिकोण वांछित कार्यक्षमता प्रदान करने के लिए एक कस्टम बैश फ़ंक्शन का उपयोग करता है। आप अपने टर्मिनल सत्र में निम्नलिखित पंक्ति को निष्पादित करके इसे परिभाषित करते हैं। ध्यान दें कि आपने इसके बजाय किसी मान्य बैश चर नाम को चुना हो सकता है runandlog:

runandlog () ( IFS=' '; printf "[%s] $ %s\n%s\n" "$USER" "${*:2}" "$("${@:2}")" | tee -a "$1" | tail -n +2; )

यह हालांकि केवल वर्तमान बैश सत्र के लिए बनी रहती है, इसका मतलब है कि टर्मिनल विंडो को बंद करने के बाद, फ़ंक्शन चला जाएगा।
यदि आपने इसकी कोशिश की और इसे पसंद किया है, तो आप इसे हमेशा अपनी ~/.bashrcफ़ाइल को संपादित करके और इस पंक्ति को इसके अंत में जोड़कर उपलब्ध करा सकते हैं ।

कैसे इस्तेमाल करे:

फ़ंक्शन को परिभाषित करने के बाद, आप इसे कमांड को चलाने के लिए उपयोग कर सकते हैं, जबकि दोनों कमांड और इसके आउटपुट को एक फ़ाइल में लॉग कर सकते हैं। आप इसे निष्पादित करने वाले उपयोगकर्ता की तरह अधिक जानकारी भी जोड़ सकते हैं, जिसे मैंने पहले ही फ़ंक्शन में शामिल कर लिया था, या ठीक समय पर इसे चलाया गया था। टिप्पणियों में फ़ीचर-अनुरोधों का स्वागत है! :)

वाक्य रचना सरल है:

runandlog LOGFILENAME YOUR-COMMAND-WITH-ARGUMENTS

उदाहरण:

उपयोगकर्ता के रूप में एक उदाहरण सत्र bytecommander, होम डायरेक्टरी से संचालन इस तरह दिख सकता है:

bytecommander: ~ $  runandlog mylogfile fortune
A mathematician is a device for turning coffee into theorems.
        -- P. Erdos

जिसके परिणामस्वरूप एक नई फ़ाइल होगी mylogfile (यदि यह पहले से मौजूद है, तो सामग्री के साथ वर्तमान निर्देशिका में फ़ंक्शन आउटपुट को इसमें जोड़ देगा!) :

[bytecommander] $ fortune 
A mathematician is a device for turning coffee into theorems.
        -- P. Erdos

3

एक काफी अंकल लेकिन कार्यात्मक चाल होगी:

(echo "apt-cache depends kde-window-manager" && apt-cache depends kde-window-manager) > ~/Desktop/kwin-depends

बदसूरत, लेकिन यह काम करता है!


मैं इस उत्तर को स्वीकार कर रहा हूं क्योंकि समाधान अधिक व्यापक रूप से लागू है।
डीके बोस

@DKBose आपको दो बार मॉड्यूल टाइप करना होगा। लेकिन एक स्क्रिप्ट के साथ समाधान वास्तव में सार्वभौमिक है।
पायलट 6

मुझे खेद है कि मुझे इस उत्तर को अस्वीकार करना पड़ा, भले ही उसने वही किया जो मैंने मांगा था। मुझे आशा है कि आप बुरा नहीं मानेंगे!
डीके बोस

2
कोई समस्या नहीं @DKBose, मुझे पता था कि यह एक काफी अशुभ समाधान था क्योंकि मैंने जवाब प्रस्तुत किया था, और पोस्ट किए गए वैकल्पिक उत्तरों से कुछ अच्छा सामान सीखा है।
आर्कटिक

2

आप बस कमांड को एक फंक्शन में पास कर सकते हैं, जो पहले कमांड को प्रिंट करेगा और कमांड का आउटपुट बाद में करेगा (रीडायरेक्शंस को प्रिंटेड कमांड से जानबूझकर बाहर रखा गया है, आप कमांड से उद्धरण हटाकर और प्रिंट करके और चलाने के $@बजाय इसे आसानी से बदल सकते हैं। के $1समारोह में):

function myfunction() {
    printf "%s\n\n" "$1"
    $1
}
$ myfunction "printf \"bar\n\"" > foo
$ cat foo
printf "bar\n"

bar

बाद में कमांड जोड़ने के लिए आप इस कमांड को चला सकते हैं, जो एक फाइल के शीर्ष पर अंतिम कमांड रन को सम्मिलित करेगा:

<<<"$(<foo)" cat <(history 2 | sed -n '1s/  [0-9][0-9]*  \(.*\)/\1\n/p') - >foo
  • <<<"[...]": यहां स्ट्रिंग; [...]पर भेज दिया जाएगा catके stdin;
  • $(<foo): कमांड प्रतिस्थापन; इसे "फू" की सामग्री से बदल दिया गया है;
  • cat [...] - >foo: संयोजित stdinकरने के लिए [...]और "foo" करने के लिए आउटपुट,
  • <([...]): प्रक्रिया प्रतिस्थापन: यह एक फ़ाइल विवरणक के साथ प्रतिस्थापित किया जाता है जिसमें आउटपुट होता है [...];
  • history 2 | sed -n '1s/ [0-9][0-9]* \(.*\)/\1\n/p': अंतिम दो कमांड को आउटपुट करता है, दो स्थानों को हटाता है, उसके बाद एक या एक से अधिक अंक और उसके बाद पहली पंक्ति से दो स्थान निकालता है;
$ printf "bar\n" >foo
$ <<<"$(<foo)" cat <(history 2 | sed -n '1s/  [0-9][0-9]*  \(.*\)/\1\n/p') - >foo
$ cat foo
printf "bar" >foo

bar

आप केवल छपाई क्यों कर रहे हैं $1? और इसकी कोई आवश्यकता नहीं है eval
टेराडॉन

@terdon खैर, विचार मुद्रित आदेश से पुनर्निर्देशन रखने के लिए था, क्योंकि मुझे लगा कि यह ओपी के मामले में अच्छे लग सकते हैं। फिर भी अगर मैं इसे बदल देता हूं तो यह आपके उत्तर के समान होगा। हालांकि हां, evalइसकी जरूरत नहीं है, यह सुनिश्चित नहीं है कि मैंने इसे पहले क्यों जोड़ा। धन्यवाद।
कोस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.