শেল ওয়াইল্ডকার্ড চরিত্রের সম্প্রসারণ বন্ধ করবেন?


91

কোনও সংকলিত কমান্ড-লাইন প্রোগ্রামের জন্য বাশ বা সিএসএসকে বলতে কোনও উপায় আছে যে এটি এর পরামিতিগুলিতে কোনও ওয়াইল্ডকার্ড অক্ষর প্রসারিত করতে চায় না?

উদাহরণস্বরূপ, কেউ শেল কমান্ড চাইবে যেমন:

foo *

কেবলমাত্র সেই অক্ষরের সংখ্যাগত ASCII মানটি ফিরিয়ে আনতে।

উত্তর:


122

না। কমান্ডটি আসলে চালুর আগে সম্প্রসারণ ঘটে।
আপনি কেবল কমান্ড চালানোর আগে বা তারার উদ্ধৃতি দিয়ে গ্লোব অক্ষম করতে পারেন।

$ # quote it
$ foo '*'

$ # or escape it
$ foo \*

$ # or disable the glob (noglob)
$ set -f
$ foo *

$ # alternative to set -f
$ set -o noglob
$ # undo it by 
$ set +o noglob

4
এছাড়াও, যদি প্রসারিত করার মতো কিছু না থাকে তবে কোনও প্রসার নেই। যেমন একটি খালি সঙ্গে pwd, echo *ঠিক*
সাম বুসালিস

7
@ সাম এটি আপনার বিকল্পগুলি কীভাবে সেট করা যায় তার উপর নির্ভর করে। Tldp থেকে: "যদি কোনও মিলে যাওয়া ফাইলের নাম খুঁজে পাওয়া যায় না, এবং শেল বিকল্পটি nullglobঅক্ষম থাকে তবে শব্দটি অপরিবর্তিত থাকে nullglobthe
ক্রিস মিডলটন

ধন্যবাদ, আমার যোগ্য হওয়া উচিত ছিল যে এটি পর্যবেক্ষণ থেকে কোনও বোঝাপড়া নয়।
সাম বুসালিস

@ c00kiemon5ter কীভাবে এটিকে পূর্বাবস্থাপন করবেন set -f? এটা কি unset -f?
নাম জি ভিইউ

4
@ নামজিভিউset +f
ক্রিশ্চিয়েনসেন

63

এটি সত্য হলেও কোনও কমান্ড নিজেই গ্লোববিং বন্ধ করতে পারে না, তবে ইউনিক্স শেলকে কোনও নির্দিষ্ট কমান্ডকে গ্লোব না করতে বলা সম্ভব। এটি সাধারণত শেলের কনফিগারেশন ফাইলগুলি সম্পাদনা করে সম্পন্ন হয়। কমান্ড ধরে নেওয়া যাক fooকমান্ড পথ বরাবর পাওয়া যাবে, নিম্নলিখিত উপযুক্ত কনফিগারেশন ফাইল যোগ করা প্রয়োজন হবে:

শি, বাশ এবং কেএস শেলের জন্য:

alias foo='set -f;foo';foo(){ command foo "$@";set +f;}

সিএসএস এবং টিসিএস শেলের জন্য:

alias foo 'set noglob;\foo \!*;unset noglob'

Zsh শেল জন্য:

alias foo='noglob foo'

কমান্ড পাথটি ব্যবহার করতে হবে না। বলুন কমান্ড foo ডিরেক্টরি ~ / বিনে সঞ্চিত আছে, তারপরে উপরেরটি হয়ে যাবে:

শি, বাশ এবং কেএস শেলের জন্য:

alias foo='set -f;foo';foo(){ ~/bin/foo "$@";set +f;}

সিএসএস এবং টিসিএস শেলের জন্য:

alias foo 'set noglob;$home/bin/foo \!*;unset noglob'

Zsh শেল জন্য:

alias foo='noglob ~/bin/foo'

উপরের সমস্তটি অ্যাপলের OSX 10.9.2 ব্যবহার করে পরীক্ষা করা হয়েছিল। দ্রষ্টব্য: উপরের কোডটি অনুলিপি করার সময়, কোনও স্থান মুছে ফেলার বিষয়ে সতর্ক থাকুন। তারা উল্লেখযোগ্য হতে পারে।

হালনাগাদ:

ব্যাশ শেলের ক্ষেত্রে ব্যবহারকারী গিরা উল্লেখ করেছেন

alias foo='set -f;foo';foo(){ ~/bin/foo "$@";set +f;}

সঙ্গে প্রতিস্থাপন করা যেতে পারে

reset_expansion(){ CMD="$1";shift;$CMD "$@";set +f;}
alias foo='set -f;reset_expansion ~/bin/foo'

যা ফাংশন ফু এর প্রয়োজনীয়তা দূর করে।

এই দস্তাবেজটি তৈরি করতে ব্যবহৃত কিছু ওয়েব সাইট:


4
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত ছিল কারণ এটি প্রমাণ করে যে ওপি যা চায় তা করা সত্যই সম্ভব। বাশে
geira

@ গিরা: কখনও কখনও আরও ভাল উত্তর পোস্ট করার আগে একটি উত্তর গৃহীত হয়। আমি বিশ্বাস করি এটি সেই ক্ষেত্রে অন্যতম হতে পারে। আমি বিশ্বাস করি যে উত্তরগুলির ব্যবহারকারীর দ্বারা সর্বাধিক ব্যবহারযোগ্য হিসাবে প্রথমে শেষ। দ্রষ্টব্য: আমি আমার উত্তরে আপনার ইনপুট যুক্ত করেছি।
ডেভিড অ্যান্ডারসন

@ গিরা, ওপি সংকলিত প্রোগ্রামটি শেলের সাথে যোগাযোগ করতে চায়; কমান্ড-বাই-কমান্ডের ভিত্তিতে শেলটি কনফিগার করা পছন্দ করার মতো উত্তর দেওয়া একটি দরকারী উত্তর, এবং আমি নিজেই এটিকে গ্রহণ করব, তবে এটি সম্পূর্ণ অন-পয়েন্ট কিনা তা নিয়ে আমি দ্বিমত পোষণ করার সুযোগ পাচ্ছি না।
চার্লস ডাফি 0

এটি করা যেতে পারে তার অর্থ এই নয় যে এটি করা উচিত । নির্বাচিত কমান্ডগুলির জন্য ব্যবহারকারীর যুক্তিসঙ্গত প্রত্যাশা থেকে শেলের আচরণ পরিবর্তন হওয়া অবাক হওয়ার মতো এবং শেষ পর্যন্ত অনাকাঙ্ক্ষিত মনে হয়।
ট্রিপলি

@ ট্রিপলি: এমন এক সময় ছিল যখন লোকেরা রিলে এবং ভ্যাকুয়াম টিউব আশা করত। প্রত্যাশিত কার্ডবোর্ড কার্ড এবং কাগজের টেপগুলিতে খোঁচা দেওয়া হয়েছিল। লোকেরা ক্যালকুলেটর এবং ফোনের পরিবর্তে স্লাইড নিয়ম ধারণ করে। আমি মনে করি আপনার জন্য এটি পছন্দসই হবে। আমি এই সময়ের জন্য খুব একটা যত্ন করি নি। এরপরে যা আছে তা দেখে আমি উপভোগ করি।
ডেভিড অ্যান্ডারসন 11

8

আপনার প্রোগ্রামটি চালুর আগে শেল দ্বারা সম্প্রসারণ করা হয়। আপনার প্রোগ্রামটির সম্প্রসারণ হয়েছে কিনা তা সম্পর্কে কোনও ধারণা নেই।

   set -o noglob

আমন্ত্রণকারী শেলটিতে প্রসারণ বন্ধ করে দেবে, তবে আপনাকে এটি আগে করতে হবে আপনার প্রোগ্রামটি চালনার আপনাকে তা করতে হবে।

বিকল্পটি হল আপনার যুক্তিগুলিকে উদ্ধৃত করা উদাহরণস্বরূপ

foo "*"

4
setopt zsh- নির্দিষ্ট কমান্ড হিসাবে প্রদর্শিত হবে। অন্য পোস্টার যেমন বলেছে, বাশের জন্য আপনি set -o noglobওয়াইল্ডকার্ড সম্প্রসারণ অক্ষম করতে ব্যবহার করেন ।
বীরাওয়ান পূর্বন্তো

এখন সংশোধিত। আপনাকে ধন্যবাদ
ব্রায়ান অগ্নিউ

1

সাবধান: যদি মুখোশের সাথে কোনও মিল নেই তবে বাশ কোনও যুক্তি ছাড়াই ছাড়িয়েছে!

প্রুফ (প.পি.পি একটি খুব সাধারণ স্ক্রিপ্ট, যা কেবলমাত্র তার যুক্তিগুলি প্রিন্ট করে):

 $ ls
f1.cc  f2.cc  pa.py
 $ ./pa.py *.cc
['./pa.py', 'f1.cc', 'f2.cc']
 $ ./pa.py *.cpp
['./pa.py', '*.cpp']

4
সবসময় না। set -o nullglobবা shopt -s failglob, এবং এই আচরণটি পরিবর্তিত হবে (দুটি খুব ভিন্ন উপায়ে)।
চার্লস ডফি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.