স্ক্রিপ্ট ব্যবহার করতে পারবেন না?


11

শুধু ভাবছেন কেন এটি কাজ করছে না

#!/bin/bash 

ls /bin
ls !$

আমি ls /binদু'বার দৌড়ানোর প্রত্যাশা করি , তবে দ্বিতীয়টি ত্রুটি উত্থাপন করে যেমন !$ব্যাখ্যা করা হয়নি

আমি কি কিছু মিস করেছি, বা !$কেবল কমান্ড লাইনে কাজ করেছি?

আমি man bash(ম্যাক) এর মধ্যে প্রাসঙ্গিক অংশ খুঁজে পাইনি


9
যদিও কোনও সমাধান আছে এটি কোনও স্ক্রিপ্টে এটি অর্জনের জন্য সর্বোত্তম উপায়? আপনি যখন ইন্টারঅ্যাকটিভভাবে অ-চালনা করেন ইতিহাস কোনও কারণে ডিফল্টরূপে অক্ষম থাকে - একটি দীর্ঘ স্ক্রিপ্ট .bash_history ফাইলটিকে স্প্যাম করতে চলেছে। এটি জিজ্ঞাসা করার মতো নয় এটি বলছেন না, তবে কেবল আপনি যদি এটি কোনও স্ক্রিপ্টে ব্যবহারের কথা ভাবছেন তবে এটি কি সত্যই সেরা উপায়?
ফ্লুংগো

উত্তর:


26

শেলটি অ-ইন্টারেক্টিভভাবে চালিত হলে ইতিহাস এবং ইতিহাসের প্রসারণ ডিফল্টরূপে অক্ষম থাকে।

তোমার দরকার:

#!/bin/bash 

set -o history
set -o histexpand

ls /bin
ls !$

বা:

SHELLOPTS=history:histexpand bash script.sh

এটি চলতে পারে এমন সমস্ত বাশ ঘটনাগুলিকে প্রভাবিত করবে script.sh


9
SHELLOPTS থেকে সতর্ক থাকুন, এটা প্রভাবিত করবে bashযে রান script.sh, কিন্তু সব অন্যান্য bashদৃষ্টান্ত যে script.shঅবশেষে চালানো হতে পারে (অন্য কোন মত bashস্ক্রিপ্ট ...)।
স্টাফেন চেজেলাস

এবং এটি আপনার স্ক্রিপ্ট চালায় এমন অন্য কোনও ঘটনার উপর প্রভাব ফেলবে না bash
ব্ল্যাকলাইট জ্বলজ্বল

আমি মনে করি @ স্টাফেনচাজেলাসের মন্তব্য এটিতে সম্পাদনা করা হলে এই উত্তরটি উন্নত হবে।
অলিফোঁট - মনিকা

7

বুদ্ধিমান কাজ করতে হবে

ls /bin
ls $_

অথবা

set ls /bin
$*
$*

অথবা

c='ls /bin'
$c
$c

ক্যাভেটস: এটি মনে রাখা দরকার যে এগুলির প্রত্যেকটিই কিছু সমস্যা নিয়ে আসে। Solution _ সমাধানটি কেবল সর্বশেষ একক যুক্তিটি ক্যাপচার করে: তাই ls foo barcontaining _ ঠিক রাখবে bar। একটি ব্যবহার setআর্গুমেন্টগুলি (ওভাররাইড করবে $1, $2ইত্যাদি)। এবং এই সমস্ত লিখিত হিসাবে কাজ করবে, কিন্তু যখন আরও জটিল কমান্ডগুলিতে সাধারণীকরণ করা হয় (যেখানে পলায়ন এবং হোয়াইটস্পেসের বিষয়) তখন আপনি কিছুটা অসুবিধায় পড়তে পারেন। উদাহরণস্বরূপ: ls 'foo bar'(যেখানে একক পথনাম যুক্তি foo barরয়েছে দুই বা ততোধিক স্পেস, বা অন্য কোন হোয়াইটস্পেস অক্ষর) এই উদাহরণ পারেন সঠিকভাবে আচরণ করে যাচ্ছে না। সঠিকভাবে পালানো (সম্ভবত একটি evalকমান্ডের সাথে মিলিত ), বা এর "$@"পরিবর্তে ব্যবহার করা $*, এই ক্ষেত্রেগুলি পেতে প্রয়োজন হতে পারে।


1
এমন উত্তরের জন্য +1 যা পার্সেটিভ এবং ইন্টারেক্টিভ ব্যবহার সহজতর করার উদ্দেশ্যে বাশিজমকে অপব্যবহার করে না। (একটি সরাইয়া, ব্যাশ ইচ্ছা ইন্টারেক্টিভ ডিফল্ট সেটআপ বিস্ময়বোধক চিহ্ন প্রসারিত করতে কিছু আমি অন্য শেল এর একটি ব্যবহারকারী হিসেবে অনির্দিষ্ট অথবা, এবং হয় counterproductive কারণ এটি সবসময় আমার স্ক্রু যখন আমি কিছু জটিল শেল কমান্ড পালন করার চেষ্টা করছি)।
mtraceur

যদিও এই মুহুর্তে লেখা হয়েছে, আমি আরও জটিল কমান্ডগুলিতে সাধারণীকরণের চেষ্টা করার সময় শেল স্ক্রিপ্টারগুলির প্রাথমিক সমস্যাগুলির কারণে এটি +1 দিতে দ্বিধা ছিল। আমি কমপক্ষে একটি সম্ভাব্য সমস্যাগুলি ব্যাখ্যা করে একটি ক্যাভ্যাট অনুচ্ছেদ যুক্ত করার জন্য একটি সম্পাদনার পরামর্শ দিয়েছি suggested
mtraceur

@ এমট্রেসুর: এটি পোর্টেবল নয়, কেবল বাশ, জেডএস, কেএসএসে কাজ করুন (যদি দুটি কমান্ড একই লাইনে না থাকে)। ড্যাশে কাজ করুন, ম্যাক্স কেবল তখন ইন্টারেক্টিভ
কিউংলম

@ কুওনিম: দুঃখিত, আমি সম্ভবত খুব অযত্নে সাধারণ ছিলাম। $_পথ পোর্টেবল না হয় তবে আপনি ঠিক। setপদ্ধতির নন-ইন্টারেক্টিভ ড্যাশ কাজ করে, এবং ${1+"$@"}(প্লাস zsh বিশ্বব্যাপী ওরফে) কৌতুক, সাধারণ হওয়া উচিত যদিও আমি অস্পষ্টভাবে মনে রাখবেন যে setকিছু (পুরাতন?) শাঁস সঙ্গে পুরোপুরি পোর্টেবল নন এ ইতিহাস রয়েছে। ডিফাইন-এ-ভেরিয়েবল-হোল্ডিং-দ্য-কমান্ড-এবং-এর-পরে-এ-পদ্ধতিটি, বিশেষত যথাযথ পলায়ন এবং প্রকৃত evalকমান্ড ব্যবহার করা, আমি যতদূর জানি সম্পূর্ণরূপে বহনযোগ্য।
mtraceur
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.