বাশ স্ক্রিপ্টের মধ্যে ইতিহাস কমান্ড


20

ইতিহাস হ'ল শেল-ইন-ইন কমান্ড, আমি এটি কোনও বেস স্ক্রিপ্টের মধ্যে ব্যবহার করতে পারিনি। সুতরাং, 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
@ কেনসার্প এটি কারণ যে আপনি এটি একটি শ স্ক্রিপ্টে ব্যবহার করার চেষ্টা করেছিলেন (এবং আপনার shত্রুটি বার্তার সঠিক শব্দ দ্বারা বিচার করতে পারে )। ব্যাশের ইতিহাস অ্যাক্সেস করতে আপনার ব্যাশ ব্যবহার করতে হবে (স্ক্রিপ্ট দিয়ে শুরু হওয়া #!/bin/bashবা #!/usr/bin/env bash)।
গিলস 'তাই খারাপ হওয়া বন্ধ করুন'

1
@ কেনসার্প হ্যাঁ এটি হ'ল আপনি অবশ্যই ত্রুটির বার্তাটি দিয়ে ড্যাশের আওতায় চলে এসেছেন। বাশের ত্রুটির বার্তা নেই Illegal option(এটি বলবে set: history: invalid option name)।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

এর সাথে সমস্যাটি হ'ল এটি set -o history ইতিহাসের অনুসরণে সমস্ত কমান্ড যুক্ত করে যা এরপরে if [... vars=$(...ইত্যাদির মতো এন্ট্রি দিয়ে ভরাট করা যায়
নাথ

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নীচে হিসাবে একটি স্ক্রিপ্ট তৈরি করুন । এটি এক্স নামের একটি স্ক্রিপ্ট তৈরি করে এবং এতে আপনার ইতিহাসের লাইনের 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

ইতিহাস কমান্ড বাশ স্ক্রিপ্টে ডিফল্টরূপে অক্ষম করা হয়েছে তাই হিস্ট্রি কমান্ড .sh ফাইলে কাজ করবে না। এর পুনঃনির্দেশের জন্য, দয়া করে .sh ফাইলের মধ্যে bash_history ফাইলটি পুনর্নির্দেশ করুন।

বা ইতিহাস প্রক্রিয়া ইতিহাস ফাইল উল্লেখ করে এবং রান-টাইম প্যারামিটারগুলি নীচে উল্লিখিত পরিবর্তন করে সক্ষম করা যেতে পারে

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

দ্রষ্টব্য: স্ক্রিপ্ট ফাইলের শীর্ষে দুটি লাইনের উপরে উল্লিখিত হয়েছে। এখন ইতিহাস কমান্ড ইতিহাসে কাজ করবে।


0

প্রত্যেক ব্যবহারকারীর নিজস্ব ইতিহাস ফাইল রয়েছে যা ইতিহাস কমান্ডের ফলাফল your আপনার শেল স্ক্রিপ্টে ইতিহাস কমান্ড ব্যবহারের পরে আপনি ব্যবহারকারীর জন্য ইতিহাস ফাইলটি ব্যবহার করতে পারেন। .bash_historyব্যবহারকারীর হোম ডিরেক্টরিতে একটি ফাইল থাকবে, এটি ব্যবহারকারীর জন্য ইতিহাস ফাইল হবে।


-1

সংক্ষিপ্ত উত্তর :

history -pস্পষ্টভাবে ইতিহাসের সম্প্রসারণ করতে ব্যবহার করুন ।

একটি উদাহরণ অনুসরণ।

একটি ব্যবহারের ক্ষেত্রে আমার ক্ষেত্রে অনেক কিছু ঘটে:

  • পূর্ববর্তী কমান্ডটি ফাইলের নামের একটি তালিকা পেয়ে স্ট্যান্ডআউটে প্রিন্ট করে,
  • আমার এই ফাইলটি ভিএম দিয়ে সম্পাদনা করা দরকার।

যেহেতু আমার বাশ হয়েছে set -o histexpand, সাধারণত আমি যা করি তা টাইপ করা

vim $(!!)

পূর্ববর্তী কমান্ড দ্বারা তালিকাভুক্ত ফাইলগুলি সম্পাদনা করতে।

দুঃখের বিষয় মাঝে মাঝে ভুল হয় তাই আমি এর মাধ্যমে যাচাই করতে সক্ষম হয়েছি shopt -s histverify

এখন আমি একটি অতিরিক্ত Returnকী দিয়ে ব্যয় করে প্রসারণটি যাচাই করতে পারি ।

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

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

এখানে আমি দুটি নেস্টেড ব্যবহার করেছি command substitution, অভ্যন্তরীণটি !!পূর্ববর্তী কমান্ডটিতে প্রসারিত করতে, বহিরাগতটি এটি সম্পাদন করতে এবং আউটপুট পেতে।

আমি কেবল তিনটি কী দিয়ে একই প্রভাব অর্জন করতে পারি এবং এর মধ্যে একটি Return!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.