बैश स्क्रिप्ट के अंदर हिस्ट्री कमांड


20

इतिहास एक शेल-कमांड है जिसे मैं एक BASH स्क्रिप्ट में उपयोग नहीं कर सका। तो, क्या BASH स्क्रिप्ट का उपयोग करके इसे प्राप्त करने का कोई तरीका है?
यहाँ हम आपके लिए मेरी स्क्रिप्ट लेते हैं:

#!/bin/bash
history |  tail -100 > /tmp/history.log
cd /tmp
uuencode history.log history.txt  | mail -s "History log of server" hello@hel.com

जवाबों:


32

बैश डिफ़ॉल्ट रूप से गैर-सक्रिय गोले में इतिहास को निष्क्रिय कर देता है, लेकिन आप इसे चालू कर सकते हैं।

#!/bin/bash
HISTFILE=~/.bash_history
set -o history
history | tail 

लेकिन अगर आप उस सर्वर पर गतिविधि की निगरानी करने की कोशिश कर रहे हैं, तो शेल इतिहास बेकार है (यह कमांड चलाने के लिए तुच्छ है जो इतिहास में दिखाई नहीं देता है)। देखें कि मैं लिनक्स में लॉन्च होने वाली सभी प्रक्रिया को कैसे लॉग कर सकता हूं

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


यह एक स्क्रिप्ट में काम करने से इनकार करता है:histtest.sh: 5: set: Illegal option -o history
केन शार्प

4
@KenSharp ऐसा इसलिए है क्योंकि आपने इसे एक स्क्रिप्ट में उपयोग करने की कोशिश की है (और shत्रुटि संदेश के सटीक शब्दों द्वारा आपके डैश को कम किया जा रहा है)। बैश के इतिहास तक पहुंचने के लिए, आपको बैश (स्क्रिप्ट की शुरुआत #!/bin/bashया उसके साथ #!/usr/bin/env bash) का उपयोग करने की आवश्यकता है ।
गिलेस एसओ- बुराई को रोकना '

1
@KenSharp हाँ यह है। आपने स्पष्ट रूप से इसे डैश के नीचे चलाया, त्रुटि संदेश दिया। बैश में त्रुटि संदेश नहीं है Illegal option(यह कहेंगे set: history: invalid option name)।
गिल्स एसओ- बुराई को रोकना '

इसके साथ समस्या यह है कि यह set -o history इतिहास के बाद सभी आदेशों को जोड़ता है जो बाद में प्रविष्टियों जैसे if [... vars=$(...इत्यादि से भरा होने वाला है
nath

1
@ नाथ यही प्रश्न पूछा। यह बहुत ज्यादा व्यर्थ है, जैसा कि मैं इंगित करता हूं। गतिविधि की निगरानी एक कठिन समस्या है जिसका शेल इतिहास हल नहीं करेगा। यदि आप किसी स्क्रिप्ट को डीबग कर रहे हैं तो set -xबहुत अधिक उपयोगी है।
गिल्स एसओ- बुराई को रोकना '

6

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

सीधे स्रोत पर क्यों न जाएं ${HOME}/.bash_history, history | tail -100साथ बदलें tail -100 ${HOME}/.bash_history। (यदि आप टाइमस्टैम्प का उपयोग करते हैं तो आपको संभवतः कुछ करना होगा grep -v ^# ${HOME}/.bash_history | tail -100)।


वास्तव में, टाइमस्टैम्प के साथ, आपको वास्तव में greq -v '^#[0-9]\+$'(मुझे कभी-कभी "मेरे शेल में टिप्पणियों" पर अमल करना चाहिए ...)
प्लाज़्माबिनटॉन्ग

और वास्तव में, मेरे मामले में, मुझे सही हिस्ट्री लाइन नंबर का उपयोग करने की आवश्यकता है , लेकिन विधि historyके आउटपुट और आउटपुट के बीच अंतर है grep...
प्लाज़्माबिनटॉन्ग

ठीक है, इतिहास सूची के साथ इतिहास सूची को इस तरह से सिंक्रनाइज़ करना था history -a; history -c; history -r:। (जोड़ें, स्पष्ट, पढ़ें)
प्लाज्माबिन्टॉन्ग

2

यदि आप historyकिसी स्क्रिप्ट में एक सक्रिय शेल सत्र से कमांड के आउटपुट का उपयोग करना चाहते हैं , तो आप पहले कमांड को चलाने के लिए अन्य उपनाम का उपयोग कर सकते हैं। फिर, उसी उपनाम में, आप शेष स्क्रिप्ट को कॉल कर सकते हैं। इस तरह के कॉन्फ़िगरेशन के साथ, आप historyवास्तविक स्क्रिप्ट में कमांड के रूप में अनिवार्य रूप से एक ही परिणाम प्राप्त कर सकते हैं ।

उदाहरण के लिए, आप इस तरह से एक उपनाम बना सकते हैं, स्क्रिप्ट का नाम स्क्रिप्ट है।

alias hy_tmp='history | tail -100 > /tmp/history.log ; bash /patch/to/script.sh'

और स्क्रिप्ट को इसमें बदलें:

#!/bin/bash
cd /tmp
uuencode history.log history.txt  | mail -s "History log of server" hello@hel.com

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

अपडेट किए जाने के लिए एक नए शेल में लॉग किए बिना मेरी संचयी इतिहास फ़ाइल को अपडेट करने की परेशानी बहुत कम है ~/bash_history। एक सर्वर की निगरानी के लिए यह स्पष्ट रूप से काम नहीं करेगा, जैसा कि अन्य उत्तरों में बताया गया है।

विशेष रूप से मेरा उपयोग है:

alias hbye='history | cut -c 8- > /home/chris/.bash_history_c; bash /hby.sh

स्क्रिप्ट hby.shतब सभी ~/.bash_history*फ़ाइलों से सभी अद्वितीय प्रविष्टियों को खींचती है ।


1

इतिहास का निर्माण शेल स्क्रिप्ट के अंदर अक्षम किया गया लगता है। यहां देखें: http://www.tldp.org/LDP/abs/html/histcommands.html

मुझे इस बारे में कोई आधिकारिक दस्तावेज नहीं मिला है।


1

एक स्क्रिप्ट बनाएं जिसका नाम script.shनीचे दिया गया है। यह X नाम की एक स्क्रिप्ट बनाता है और इसमें आपके इतिहास की Y संख्या डाल देता है।

#!/bin/bash
SCRIPT_NAME=$1
NUMBER_OF_LINES_BACK=$2

# Enable History in a non interactive shell
HISTFILE=~/.bash_history
set -o history

# echo shabang line and x number of lines of history to new script
echo \#\!\/bin\/bash > $SCRIPT_NAME.sh; history | tail -n $NUMBER_OF_LINES_BACK >> $SCRIPT_NAME.sh;
chmod u+x $SCRIPT_NAME.sh;

# Open the newly created script with vim
vim $SCRIPT_NAME.sh;
~

फिर यदि आप एक स्क्रिप्ट को "कार्य" नामक एक कार्य को पूरा करना चाहते हैं जिसे आप पिछले 14 लाइनों के लिए काम कर रहे हैं

script.sh task 14

फिर एक अच्छी स्क्रिप्ट बनाने के लिए अपने इतिहास को साफ़ करें!


histtest.sh: 5: set: Illegal option -o history
केन शार्प

1

इतिहास कमांड डिफ़ॉल्ट रूप से bash स्क्रिप्ट पर अक्षम है, यही कारण है कि इतिहास कमांड भी .sh फ़ाइल में काम नहीं करेगा। इसके पुनर्निर्देशन के लिए, कृपया .sh फ़ाइल के अंदर bash_history फ़ाइल पुनर्निर्देशित करें।

या इतिहास तंत्र को इतिहास फ़ाइल का उल्लेख करके भी चलाया जा सकता है और नीचे बताए अनुसार रन-टाइम पैरामीटर बदल सकते हैं

#!/bin/bash
HISTFILE=~/.bash_history
set -o history 

नोट: स्क्रिप्ट फ़ाइल के शीर्ष पर दो लाइनों के ऊपर उल्लेख किया गया है। अब इतिहास कमांड इतिहास में काम करेगा।


0

प्रत्येक उपयोगकर्ता के पास यह इतिहास फ़ाइल है जो इतिहास कमांड का परिणाम है। अपने शेल स्क्रिप्ट में इतिहास कमांड का उपयोग करने के बजाय आप उपयोगकर्ता के लिए इतिहास फ़ाइल का उपयोग कर सकते हैं। .bash_historyउपयोगकर्ता की होम निर्देशिका में एक फ़ाइल होगी, जो उपयोगकर्ता के लिए इतिहास फ़ाइल होगी।


-1

संक्षिप्त उत्तर :

history -pस्पष्ट रूप से इतिहास विस्तार करने के लिए उपयोग करें।

एक उदाहरण इस प्रकार है।

एक उपयोग मामला मेरे लिए बहुत कुछ होता है:

  • पिछली कमांड को फ़ाइल नामों की एक सूची मिलती है, और प्रिंटआउट के लिए,
  • मुझे उन फ़ाइल को vim के साथ संपादित करने की आवश्यकता है।

चूंकि मेरा बैश रहा है set -o histexpand, आमतौर पर मैंने जो किया वह टाइपिंग है

vim $(!!)

पिछली कमांड द्वारा सूचीबद्ध उन फ़ाइलों को संपादित करने के लिए।

अफसोस की बात है कि कभी-कभी गलती हो जाती है, इसलिए मैं सत्यापन को सक्षम करता हूं shopt -s histverify

अब मैं एक अतिरिक्त Returnकुंजी की लागत के साथ विस्तार को सत्यापित कर सकता हूं ।

आज मैं उन विवरणों को एक बश फ़ंक्शन में लपेटना चाहता हूं क्योंकि मैं उन्हें बहुत उपयोग करता हूं,

function vk() {
    set -o history && set -o histexpand;
    vim -i ~/.viminfok $($(history -p !!));
}

यहां मैं दो नेस्टेड का उपयोग करता हूं command substitution, आंतरिक एक !!पिछले कमांड का विस्तार करने के लिए, बाहरी एक इसे निष्पादित करने और आउटपुट प्राप्त करने के लिए।

अब मैं एक ही प्रभाव को प्राप्त कर सकता हूं, केवल तीन कुंजी के साथ, और उनमें से एक है Return!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.