বাশ ফাইল থেকে কোনও ফাইলে টার্মিনালের ইতিহাস কীভাবে সংরক্ষণ করবেন?


7

আমি একটি বাশ স্ক্রিপ্ট তৈরি করার চেষ্টা করছি যা টার্মিনাল ইতিহাসকে হস্ট.টিএসটিএসটি নামে একটি ফাইলে সংরক্ষণ করবে। history > hist.txtব্যাশ স্ক্রিপ্টে ব্যবহার করা মনে হয় না, তবে কমান্ড লাইনে মৃত্যুদন্ড কার্যকর করার সময় এটি কাজ করে works

কোন গাইডেন্স প্রশংসিত হয়।

আপনাকে জুডি ধন্যবাদ


3
আপনার প্রশ্নটি কিছুটা বিভ্রান্তিকর। "বাশ ফাইলে কাজ করছেন বলে মনে হচ্ছে না, তবে কমান্ড লাইনে মৃত্যুদন্ড কার্যকর করার পরে আপনি ঠিকঠাক কাজ করেন" এর অর্থ কী? আপনি কি বোঝাতে চাইছেন যে আপনি চালিত বাশ স্ক্রিপ্টের মধ্য থেকে আপনার কমান্ডের ইতিহাসটি সংরক্ষণ করার চেষ্টা করছেন? আপনি যেমন সংরক্ষণ করতে চান স্ক্রিপ্ট দ্বারা কোন আদেশগুলি কার্যকর করা হয়েছে? লিপি নিজেই এই ক্ষেত্রে একটি ইতিহাস।
স্টিফেন

6
অথবা আপনি কোনও নির্দিষ্ট ব্যবহারকারীর ব্যাশ ইতিহাস আউটপুট করতে চান? আপনি কেবল ব্যবহারকারীর ~/.bash_historyফাইলটি পড়তে পারেন ।
অ্যারোনিকাল

1
@ অ্যারোনিকাল নোট যে এটি কেবল তখনই কাজ করবে যদি ব্যবহারকারী বাশকে তাদের শেল হিসাবে ব্যবহার করে যা সর্বদা ক্ষেত্রে হয় না।

1
@ p0llard অবশ্যই, আমি এই ধারণাটি নিয়ে লাফিয়েছিলাম যে এটি বাশ স্ক্রিপ্টে ছিল, এটি ব্যবহারকারীর শেল হিসাবে বাশ হবে, তবে আপনি যেমন বলেছিলেন তেমনটি নাও হতে পারে। আপনার উত্তর BTW ভাল বিশদ এবং পটভূমি।
অ্যারোনিকাল

উত্তর:


11

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

সঙ্গে স্ক্রিপ্টটি রান sourceবা .:

source ./script_name.sh

অথবা

. ./script_name.sh

আধুনিক বিভিন্ন শেল জুড়ে সামান্য আরও সামঞ্জস্যপূর্ণ।

দীর্ঘ উত্তর

এই প্রশ্নটি একটি গুরুত্বপূর্ণ পয়েন্ট হাইলাইট করে, এটি হ'ল শেল স্ক্রিপ্টগুলি তাদের নিজস্ব প্রসঙ্গে চালিত হয়। এর অর্থ কী তা দেখতে, নিম্নলিখিত শেল স্ক্রিপ্টটি বিবেচনা করুন:

#!/bin/bash

cd /
ls

আপনি যদি এটি চালনা করেন তবে আপনি এই জাতীয় একটি আউটপুট পাবেন:

bin  boot  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

তবে আপনি লক্ষ্য করবেন যে স্ক্রিপ্টটি চালানোর পরে আপনি চালনার আগে আপনি যে কোনও ডিরেক্টরিতে ছিলেন তার মধ্যে এখনও রয়েছেন: cd /স্ক্রিপ্টটির অভ্যন্তরটি আসলে আপনার অধিবেশনকে প্রভাবিত করে না - এটি কেবল সেই প্রসঙ্গে প্রভাব ফেলেছিল যা স্ক্রিপ্টটি চলছিল, কোনটি স্ক্রিপ্টটি চালু হওয়ার জন্য তৈরি করা হয় এবং এটি ফিরে আসার পরে ধ্বংস হয় destroyed

sourceকমান্ড 'পড়তে এবং বর্তমান শেল প্রেক্ষাপটে ফাইলের নাম যুক্তি থেকে কমান্ডগুলো', তাই মত কোন কমান্ড হবে cdএটা ভিতরে আপনার বর্তমান সেশন প্রভাবিত করবে। যদি আপনি উপরের স্ক্রিপ্টটি চালিয়ে যান তবে sourceআপনি এটি দেখতে পেলেন যে এটি চালানোর পরে আপনি মূল ডিরেক্টরিতে গিয়ে শেষ করেছেন।

এই ক্ষেত্রে, সমস্যাটি হ'ল historyকমান্ডটি আপনাকে বর্তমান শেল প্রসঙ্গে ইতিহাস দেয়; আপনার স্ক্রিপ্টটি ব্যবহার না করে চালানো শেল প্রসঙ্গে sourceতার কোনও ইতিহাস নেই, সুতরাং এটি আউটপুট ফাইলে কিছুই লিখবে না। আপনি যদি sourceএটি ব্যবহার করেন তবে সঠিক প্রসঙ্গে কার্যকর হবে এবং প্রত্যাশার মতো কাজ করবে।

বিশেষ দ্রষ্টব্য: sourceএকটি শেল বিল্ট-ইন করা হয়, না একটি প্রোগ্রাম কোনটাই - ব্যাশ এ, sourceসমার্থক ., কিন্তু কিছু শাঁস একমাত্র .কাজ করবে - আমি ব্যবহার করেছি sourceএই উত্তরটি কারণ বেশি সহজ চেয়ে পড়তে ., কিন্তু সর্বাধিক সামঞ্জস্যের জন্য, .উচিত ব্যবহার করা.


খুব আকর্ষণীয় পড়া। আমি সর্বদা 'অনুপস্থিত' ইতিহাস কমান্ড সম্পর্কে ভাবছিলাম, এখন কেন তা জানি। ধন্যবাদ!
টিকো

10

প্রথমত, দ্রষ্টব্য যে আপনার ইতিহাস ইতিমধ্যে একটি ফাইলে রয়েছে। আপনি যদি বাশ চালাচ্ছেন তবে এর নামটি সাধারণত ~/.bash_history। আরো নির্দিষ্টভাবে, এটি যাই হোক না কেন আপনি পরিবর্তনশীল সেট করেছি HISTFILEকরতে। আপনি যদি এটি অন্য কোনও ফাইলে অনুলিপি করতে চান তবে চালানcat "$HISTFILE" > hist.txt

এখন, কেন historyবাশ শেল স্ক্রিপ্টে কমান্ডটি কাজ করে না, কারণ আপনার বর্তমান শেল সেশনের একটি অ-ইন্টারেক্টিভ চাইল্ড শেলটিতে স্ক্রিপ্টগুলি চালিত হয়। শিশু শেলগুলি পিতামাতার সমস্ত পরিবেশের উত্তরাধিকার সূত্রে প্রাপ্ত হয় না (তাই সমস্ত সেট চলকগুলির নয়), রফতানি করা কেবলমাত্র ভেরিয়েবলগুলি। উদাহরণস্বরূপ, নীচের স্ক্রিপ্টটি ভেরিয়েবলের মান প্রতিধ্বনিত করবে $var:

#!/bin/bash
echo "$var"

এখন, $varকিছুতে সেট করুন এবং স্ক্রিপ্টটি চালান:

$ var="foo"
$ foo.sh
VAR: 

এর পরে, প্রথমে চলকটি রফতানি করুন:

$ var="foo"
$ export var
$ foo.sh
VAR: foo

আপনি দেখতে পাচ্ছেন, যখন পরিবর্তনশীল রফতানি করা হয়েছে, এটি শিশু শেলগুলির জন্য উপলব্ধ।

যেমনটি আমি আগেই বলেছি, ইতিহাসটি ভেরিয়েবল দ্বারা নির্দেশিত ফাইলে সংরক্ষণ করা হয় $HISTFILENAME। যেটি ডিফল্টরূপে রফতানি হয় না, স্ক্রিপ্ট চালানোর সময় এটি সেট করা হয় না:

$ cat foo.sh
#!/bin/bash
echo "HISTFILE: $HISTFILE"
$ ./foo.sh
HISTFILE:
$ echo $HISTFILE
/home/terdon/.bash_history

উপরের উদাহরণে আপনি দেখতে পাচ্ছেন, পরিবর্তনশীলটি HISTFILEআমার সাধারণ শেল সেশনে সেট করা আছে, তবে স্ক্রিপ্টটি চালানোর সময় খালি রয়েছে।

সুতরাং, ইতিহাসটি পেতে আপনার কাছে কয়েকটি বিকল্প রয়েছে:

  1. ডিফল্ট HISTFILEমান $HOME/.bash_history। আপনি যদি এটি পরিবর্তন না করে থাকেন তবে আপনি সহজেই আপনার স্ক্রিপ্টে এই আদেশটি চালাতে পারেন:

    cat "$HOME/.bash_history" > history
  2. আপনি $HISTFILEআপনার স্ক্রিপ্টে ভেরিয়েবলটি পাস করতে পারেন এবং catএটি:

    #!/bin/bash
    cat "$1" > history

    উপরোক্ত হিসাবে সংরক্ষণ করুন foo.shএবং এটি চালান:

    ./foo.sh "$HISTORY"
  3. ভেরিয়েবলটি রফতানি হয়েছে তা নিশ্চিত করুন। আপনার ~/.bash_profile(যদি এটি বিদ্যমান থাকে) বা ~/.profile( ~/.bash_profileউপস্থিত না থাকে) ফাইলগুলিতে এই লাইনটি যুক্ত করুন :

    export HISTFILE

    তারপরে, লগ আউট এবং আবার লগ ইন করুন এবং আপনি history > hist.txtপ্রত্যাশা মতো স্ক্রিপ্ট থেকে চালাতে সক্ষম হবেন । এর কারণ export VARহল "শিশু শেলগুলির জন্য make VAR উপলব্ধ করুন" means ব্যবহারিক ভাষায়, এর অর্থ হ'ল এর HISTFILEস্ক্রিপ্টটি চালানোর জন্য আপনি যে অ-ইন্টারেক্টিভ শেল ব্যবহার করেন তার মান উত্তরাধিকার সূত্রে প্রাপ্ত হবে।

    এখন, HISTFILEসেটটি সেট হয়ে যাওয়ার পরে, এটি স্ক্রিপ্টটি চালানো শেল দ্বারা পড়েনি। সুতরাং, এটি কাজ করতে, আপনাকে history -rপ্রথমে এটি পড়তে হবে । পুরো স্ক্রিপ্টটি দেখতে এমন হবে:

    $!/bin/bash
    history -r
    history > hist.txt

    বিকল্পভাবে, স্ক্রিপ্টটি চালানোর আগে কেবল এটি ম্যানুয়ালি রফতানি করুন:

    $ export HISTFILE

    তবে আপনার এখনও history -rস্ক্রিপ্টে থাকা দরকার ।

  4. @ P0llard এর উত্তর অনুসারে আপনি sourceএটির পরামর্শ দিতে পারেন

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