ডিলার সাহায্যে সিএলআই যুক্তির সাহায্যে টিলড (~) কেন প্রসারিত হয় না?


9

আমি ভিএনসি সার্ভার (x0vncserver) চালানোর চেষ্টা করে কয়েক ঘন্টা হারিয়েছি এবং ক্লায়েন্টটি অদ্ভুত বার্তার সাথে সংযোগ করতে অস্বীকার করেছে যে

No password configured for VNC Auth

সার্ভারটিও এই ত্রুটিটি মুদ্রণ করে

 SVncAuth:    opening password file '~/.vnc/passwd' failed

ঠিক আছে, আমি যতক্ষণ না বুঝতে পেরেছি অনেক সময় নষ্ট করেছিলাম না টিল্ডটি শেলের দ্বারা প্রসারিত হয়নি, না x0vncserver দ্বারাও। তারপর আমি এই পরীক্ষা চালিয়েছি

$ echo --PasswordFile=~/.vnc/passwd
--PasswordFile=~/.vnc/passwd

কিন্তু

$ echo PasswordFile=~/.vnc/passwd
PasswordFile=/home/tichomir/.vnc/passwd

কেন এমন? যদি তর্কটি ড্যাশ দিয়ে শুরু হয় তবে শেল টিলডকে প্রসারিত করতে অস্বীকার করবে কেন? আমি ভেবেছিলাম যে টিল্ডটি সর্বদা প্রসারিত হবে যতক্ষণ এটি উদ্ধৃত হয় না, তবে দৃশ্যত আরও একটি নিয়ম আছে যা নাটকটিতে আসে?



উত্তর:


13

এটি bashএর ম্যানুয়ালটিতে বর্ণিত শেলের একটি বিশেষত্ব :

বাশ ভেরিয়েবল অ্যাসাইনমেন্টের শর্তকে সন্তুষ্ট করে শব্দের উপরে তিল্ড সম্প্রসারণও করে (যেমন উপরে উপরে বর্ণিত) যেমন তারা সরল কমান্ডের সাথে যুক্তি হিসাবে উপস্থিত হয়। উপরের তালিকাভুক্ত ঘোষণার আদেশগুলি ব্যতীত পশিক্স মোডে থাকলে ব্যাশ এটি করে না।

এর অর্থ এটি আপনার স্ট্রিংয়ে টিল্ডকে প্রসারিত bash করবেPasswordFile=~/.vnc/passwd , যেহেতু এটি একটি যুক্তিযুক্ত echoএকটি ভেরিয়েবল অ্যাসাইনমেন্টের মতো দেখায়।

স্ট্রিংটি --PasswordFile=~/.vnc/passwdএকটি ভেরিয়েবল অ্যাসাইনমেন্টের মতো লাগে না কারণ স্ট্রিংটি --PasswordFileবৈধ ভেরিয়েবলের নাম নয়।

লক্ষ্য করুন bashএই যখন POSIX মোডে চলমান করে না, এবং যে অন্য শেল, মত zsh, kshবা yashডিফল্টরূপে এটা করো না ( zshএকটি হয়েছে magicequalsubstটিল্ড বিস্তৃতির জন্য বিকল্প unquoted সমান চিহ্ন পরে সঞ্চালিত হবে ( =) যদিও)।

আপনি যদি নিশ্চিত করতে চান যে বর্তমান ব্যবহারকারীর হোম ডিরেক্টরি পথটি কোনও কমান্ডের সাথে যুক্তির অংশ হিসাবে যথাযথভাবে প্রসারিত হয়েছে $HOMEতবে টিলডের পরিবর্তে মানটি ব্যবহার করুন :

echo --PasswordFile="$HOME/.vnc/passwd"

"ঘোষণা উপরে তালিকাভুক্ত কমান্ড" করার জন্য ম্যানুয়াল কমান্ড আগে থেকেই রয়েছে উল্লেখ alias, declare, typeset, export, readonly, এবং local


1
+1 | আমি এটা ভাবব না।
লিনাক্সসিকিউরিটিফ্রেক

যদিও দ্রষ্টব্য: bash --posix -c '"export" a=~; printf "%s\n" "$a"'আউটপুটস ~
স্টাফেন চেজেলাস

2
মনে রাখবেন যে ~প্রসারিত হচ্ছে alias a=~একটি পসিক্স কনফরমেশন বাগ (এবং দরকারী নয়)। তবে এটি কীভাবে ksh88 এটি করেছে (এটি ksh93 এ পরিবর্তিত হয়েছে) এবং সম্ভবত বাশ, zsh এবং pdksh এটিও করেন। কেন yashযা POSIX বৈশিষ্ট বিরুদ্ধে লেখা হয়েছিল তা নয়।
স্টাফেন চেজেলাস

এটি সঠিক উত্তর, তবে সঠিক পন্থাটি একটি যুক্তি ব্যবহার করে বিকল্পের সাথে একীভূত না হয়ে কেবল বিকল্প যুক্তি হিসাবে কেবল বিকল্প যুক্তি সরবরাহ করা হত =। তারপরে টিলডের সম্প্রসারণ একটি শব্দের শুরুতে এবং প্রশ্নটি মূলত।
জেডিবিপি

1
@JdeBP, যেমন এটি ঘটলে, ক্ষেত্রে x0vncserver, x0vncserver --PasswordFile fileকাজ, আপনি প্রয়োজন নেই --PasswordFile=file
স্টাফেন চেজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.