আমি কীভাবে বাশ কমান্ড স্ট্রিংয়ের ভারব্যাটিম বর্ণগুলি পরীক্ষা করতে পারি?


15

আজ সকালে বাশ টার্মিনালে আমার এই অদ্ভুত আচরণ ছিল:

user@home:/home/user$ [ -f /etc/openvpn/client.conf ] && echo true
bash: [: missing «]»
user@home:/home/user$ [ -f /etc/openvpn/client.conf ] && echo true
true
  • প্রথম কমান্ডটি জিডিট দিয়ে সম্পাদিত স্ক্রিপ্ট থেকে আটকানো হয়েছিল ।
  • দ্বিতীয়টি সরাসরি টার্মিনালে টাইপ করা হয়েছিল।

কিছু খনন করার পরে, আমি খুঁজে পেলাম যে 30 তম অক্ষর (ক্লায়েন্ট.কনফ এবং "]" এর মধ্যে স্থান) মুছে ফেলা এবং একটি স্থান দিয়ে এটি প্রতিস্থাপন করা কমান্ডটি আবার কাজ করে work

আমার ধারণা ঠিক ছিল: একটি অজানা ফাঁকা চরিত্র কমান্ডের মধ্যে পড়েছে , তবে প্রশ্নটি হ'ল:

  1. টার্মিনালে এই অক্ষরগুলি কীভাবে প্রকাশ করব যাতে আমি কমান্ডটি ডিবাগ করতে পারি? এবং আরও গুরুত্বপূর্ণ:
  2. কীভাবে আমি আবার এটি হতে রোধ করতে পারি?

বিটিডাব্লু, আমি উবুন্টু 18.04 / ফরাসী ভাষা চালাচ্ছি, আমি যে স্ক্রিপ্টটি থেকে কমান্ডটি পেস্ট করেছি তা ইউএসবি ড্রাইভে রয়েছে এবং এটি উইন্ডোতেও সম্পাদিত হতে পারে।


আপনার খুব ভাল উত্তরের জন্য ধন্যবাদ। খারাপ চরিত্রটি একটি সি 2 এ0 নন-ব্রেকিং স্পেস ইউটিএফ -8 অক্ষর। সেডের সাহায্যে বিশেষ 'এম-বিএম-' চরিত্রটি কীভাবে সরিয়ে ফেলা হবে সে প্রশ্নে সেই চরিত্রটি সম্পর্কে আকর্ষণীয় তথ্য রয়েছে।

আশ্চর্যের বিষয় হ'ল স্ক্রিপ্টটি এই চরিত্র থেকে মুক্ত। সুতরাং কোথা থেকে এসেছে তা আমি জানি না।


3
এমন একটি সম্পাদক ব্যবহার করুন যা এই জাতীয় অক্ষরগুলিকে হাইলাইট করে। সিনট্যাক্স হাইলাইট করাও অনেক সাহায্য করে। ওয়েব থেকে কখনও টার্মিনালে সরাসরি পেস্ট করবেন না, সবসময় পূর্বোক্ত সম্পাদকটি দিয়ে যান।
চোরোবা

2
আপনি আপনার ইতিহাসের তালিকায় সমস্যাটি কমান্ডটি সন্ধান করতে চাইতে পারেন, তারপরে একটি হেক্স ডিসপ্লে প্রোগ্রামের মাধ্যমে আউটপুটটি পাইপ করুন। যাতে আপনাকে দীর্ঘ তালিকার মধ্য দিয়ে চলার দরকার না হয়, হয় ইতিহাসের তালিকার নীচে রেখে কমান্ডটি পুনরায় চালু করুন এবং চালান history 2|xxd(কারণ historyকমান্ডটি সর্বদা তালিকার সর্বশেষে থাকে), বা টাইপ করুন history|grep "CommandWithProblem"|xxd। আপনি এর পরিবর্তে অন্য কোনও হেক্স ডিসপ্লে প্রোগ্রাম ব্যবহার করতে পারেন xxdতবে এটি আমার পছন্দ মতো ফর্ম্যাটে ডিফল্ট।
এএফএইচ

@ গ্যাব্রিয়েল গ্লেন, দয়া করে সেরা / সর্বাধিক সহায়ক / যে কোনও উত্তরটিকে " স্বীকৃত " হিসাবে টিক ব্যবহার করে চিহ্নিত করুন - উত্তরটি যে সাহায্য করেছে তার প্রতিটি বিষয়ে মন্তব্য করার চেয়ে। তথ্য
Attié

1
@ অ্যাটি, হ্যাঁ, আমি করব, আমি সাধারণত সেরা উত্তরগুলি গ্রহণের আগে ২৪ ঘন্টা অপেক্ষা করি, যেমনটি প্রস্তাবিত: মেটা.স্ট্যাকেক্সেঞ্জার
গ্যাব্রিয়েল গ্লেন

1
ব্যক্তিগতভাবে আমি ব্যবহার করব set -x। এটি আপনাকে আদেশটি এবং এটি কীভাবে বিভক্ত হবে তা দেখাবে। এটি অগত্যা "এখানে খারাপ চরিত্র" বলবে না, তবে এটি আপনাকে দেখায় যে বাশ সেই চরিত্রটির উপর বিভক্ত ছিল না।
প্যাট্রিক

উত্তর:


11

একটি বিকল্প হেক্স ভিউয়ার বা সম্পাদক সহ আপনি যে অক্ষরগুলি ব্যবহার করার চেষ্টা করছেন তা দেখতে হবে to hexdumpআপনি যদি টার্মিনালের মধ্যে সীমাবদ্ধ থাকেন তবে এটি একটি ভাল বিকল্প।

$ hexdump -Cv <<"EOF"
> [ -f /etc/openvpn/client.conf ] && echo true
> EOF
00000000  5b 20 2d 66 20 2f 65 74  63 2f 6f 70 65 6e 76 70  |[ -f /etc/openvp|
00000010  6e 2f 63 6c 69 65 6e 74  2e 63 6f 6e 66 20 5d 20  |n/client.conf ] |
00000020  26 26 20 65 63 68 6f 20  74 72 75 65 0a           |&& echo true.|
0000002d

আপনি এখানে দেখতে পারেন space, close-square-brace, spaceসঠিক - 0x20, 0x5D, 0x20

এই মানগুলি হেক্সাডেসিমালে প্রদর্শিত ASCII কোড । সীমার বাইরে কোনও মান 0x20- 0x7Eএটি " মুদ্রণযোগ্য অক্ষর নয় ASCII সম্পর্কিত হিসাবে " নয় এবং সম্ভবত কমান্ড লাইন ইন্টারফেসের সাথে ভাল খেলতে পারে না।

দ্রষ্টব্য: আমি উপরের উদাহরণে ব্যবহারের জন্য আপনার প্রথম " ভাঙা " রেখাটি অনুলিপি করেছি hexdump, তাই কিছু নন-এএসসিআইআই-স্পেসটি প্রতিস্থাপন করেছে আপনার আসল উত্স এবং আপনার রেন্ডার্ড প্রশ্নের সাথে একটি ASCII স্পেসের সাথে ।


এটির পুনরাবৃত্তি করতে নিম্নলিখিত পদক্ষেপ গ্রহণ করুন:

  1. আদর্শ hexdump -Cv <<"EOF" এবং টিপুনEnter
  2. আপনি যে পাঠ্যটি ব্যবহার করতে চান তা আটকে দিন
  3. EOFনিজস্ব লাইনে টাইপ করুন এবং টিপুনEnter

টার্মিনাল এবং কমান্ড লাইন ইন্টারফেসগুলি বিশেষ অক্ষরগুলিকে ভালভাবে পরিচালনা করে না - যেমন আপনি আবিষ্কার করেছেন। আপনি যদি ডকুমেন্ট ফর্ম্যাট করতে খুব সচেতন না হন তবে মাইক্রোসফ্ট ওয়ার্ড (এবং অন্যান্য) " স্মার্ট উক্তি ব্যবহার করে আপনারও সমস্যা হবে ", এম-ড্যাশ আপনারও সমস্যা হবে, তালিকাটি এগিয়ে চলেছে ...

পার্থক্যটি চিহ্নিত করুন: (শীর্ষটি হ'ল " স্মার্ট কোটস ", নীচেটি " সোজা উদ্ধৃতি ")

স্মার্ট উদ্ধৃতি বনাম সোজা উদ্ধৃতি উদাহরণ

$ hexdump -Cv <<"EOF"
> quoted string
> EOF
00000000  e2 80 9c 71 75 6f 74 65  64 20 73 74 72 69 6e 67  |...quoted string|
00000010  e2 80 9d 0a                                       |....|
00000014

এখানে, খোলা কোট একটি সহজ হওয়া ASCII উদ্ধৃতি (নয় "), কিন্তু একটি ইউনিকোড / হয় হল UTF-8 সিরিজ - 0xE2, 0x80, 0x9C, অথবা U+201C- যা আপনি আশা করতে পারে টার্মিনাল হ্যান্ডেল করা হবে না।

কিউইয়ের পরামর্শটিও cat -Aকাজটি করে:

$ cat -A <<"EOF"
> quoted string
> EOF
M-bM-^@M-^\quoted stringM-bM-^@M-^]$

দ্রষ্টব্য: ব্যবহার করার সময়echo "..." | hd, আপনি এমন একটি সুযোগ দাঁড়াবেন যে বাশ আপনি পরিদর্শন করার চেষ্টা করছেন তার স্ট্রিংয়ের কিছু অংশ প্রতিস্থাপন করবে। কোনও স্ক্রিপ্টের উপাদানগুলি পরীক্ষা করার চেষ্টা করার সময় এটি বিশেষত উদ্বেগের বিষয়।

উদাহরণস্বরূপ চেষ্টা করুন:

$ echo "${USER}"
attie

$ echo "`whoami`"
attie

$ echo "$(whoami)"
attie

$ cat <<EOF
> ${USER}
> EOF
attie

এই পদ্ধতিগুলি প্রাসঙ্গিক পাঠ্যের সাথে উপাদানগুলি প্রতিস্থাপন করছে। এটি এড়াতে, নিম্নলিখিত পদ্ধতির একটি ব্যবহার করুন। একক উদ্ধৃতি ( ') এবং একটি " উদ্ধৃত হেরডোক " ( "EOF") ব্যবহার করুন Note

$ echo '${USER}'
${USER}

$ echo '`whoami`'
`whoami`

$ echo '$(whoami)'
$(whoami)

$ cat <<"EOF"
> ${USER}
> EOF
${USER}

এই সমাধানটি কাজ করে: echo "[ -f /etc/openvpn.ovpn ]" | hd রিটার্ন দেয় [...] c2 a0 [...]। আমরা সি 2 এ0 UT-8 চরিত্রটি নন-ব্রেকিং স্পেস
গ্যাব্রিয়েল গ্লেন

18

আপনি ব্যবহার করতে পারে catসঙ্গে -Aবিকল্প: ম্যানুয়াল থেকে:

   -A, --show-all
          equivalent to -vET
   -E, --show-ends
          display $ at end of each line
   -T, --show-tabs
          display TAB characters as ^I
   -v, --show-nonprinting
          use ^ and M- notation, except for LFD and TAB

তাই cat -A yourscrip.shআপনাকে অদৃশ্য এবং অদ্ভুত চরিত্রগুলি দেখাবে।


7
এই সমাধানটি কাজ করে: echo "[ -f /etc/openvpn.ovpn ]" | cat -Aরিটার্ন দেয় [ -f /etc/openvpn/client.ovpnM-BM- ]$। আমরা এম-বিএম- ইউটি -8 চরিত্রটি নন-ব্রেকিং স্পেস
গ্যাব্রিয়েল গ্লেন

@ গ্যাব্রিয়েলগ্লেন খুশি হলেন এটি আপনাকে সাহায্য করেছে।
কিউই

9

echo "<your command>" | hdকাজ করা উচিত. ব্যাকস্পেস (0x08) বা কোডগুলি> = 80 সহ অক্ষর সন্ধান করুন। echo "<your command>" | wc -bএবং যা যা দেখছেন তার সাথে গণনা মেলে তা পরীক্ষা করাও একটি ভাল ধারণা।

"অফিস" দিয়ে যে কোনও নামে উত্পাদিত ফাইলগুলি থেকে তার নামে ফাইলগুলি অনুলিপি করা বিপজ্জনক, কারণ এই জাতীয় সফ্টওয়্যার প্রায়শই অক্ষরগুলি প্রতিস্থাপন করতে স্বাধীনতা লাগে: ফরাসি ভাষায়, "গিলিমেটস" দ্বারা প্রতিস্থাপিত ডাবল উদ্ধৃতিগুলির জন্য ইংরেজী ভাষায় তাদের প্রতিস্থাপনের জন্য সরল উদ্ধৃতিগুলি সন্ধান করুন সমাপ্তি / বন্ধ সমান আমি খুঁজে পাওয়া সবচেয়ে কঠিনতমটি হ'ল ফাইলের নামের মাঝখানে 0-প্রস্থের অবিচ্ছেদী স্থান (সার্ভার ডাউনটাইমের 3 দিন ...)।


2
এটি উল্লেখ করা hdখুব কম, hexdumpযার জন্য এটির উত্তরটিতেও উল্লেখ করা হয়েছে।
মিকেল কেজির

@ মিকায়েলকিজার - উবুন্টু এর hdসমতুল্য hexdump -C
এএফএইচ

1
@ এক্সেনয়েড: আমি বলেছিলাম 'উইন্ডোজ এডিটেড', অফিস রাইটারের সাহায্যে সম্পাদিত নয়, আমরা পাগল নই;)। যদি এটি সম্পাদিত হয় তবে এটি নোটপ্যাড ++ সহ ছিল।
গ্যাব্রিয়েল গ্লেন

1
এই সমাধানটি কাজ করে: echo "[ -f /etc/openvpn.ovpn ]" | hd রিটার্ন দেয় [...] c2 a0 [...]। আমরা সি 2 এ0 UT-8 চরিত্রটি নন-ব্রেকিং স্পেস
গ্যাব্রিয়েল গ্লেন

2

বাশ, এবং অন্যান্য শেলগুলি zsh এর মতো একটি সম্পাদকে বর্তমান কমান্ড লাইনটি খুলতে পারে। ব্যাশ জন্য ডিফল্ট শর্টকাট C-x C-e( CtrlX CtrlE), এবং এটি প্রথম উপলব্ধ প্রর্দশিত $VISUAL, $EDITORএবং Emacs। অনুশীলনে জটিল কমান্ডগুলি ডিবাগিং এবং সংশোধন করার জন্য এটি অমূল্য। আপনি এটি কীভাবে দেখেন তার উপর নির্ভর করে zsh এখানে বাশের চেয়ে বেশি বন্ধুত্বপূর্ণ: সম্পাদক যখন প্রস্থান করেন, তখন বাশ তত্ক্ষণাত কমান্ডটি চালায়, যখন zsh আপনার চাপার জন্য অপেক্ষা করে Enter(আপনাকে কমান্ডটি সম্পাদনা করার আরও সম্ভাবনা দেয়)।

কোনও সম্পাদকে কমান্ডটি খোলার পরে, আপনি আপনার সম্পাদককে নন-এএসসিআইআই অক্ষর অন্যভাবে দেখানোর জন্য কনফিগার করতে পারেন।

উদাহরণস্বরূপ, এই সেটিংসটি ব্যবহার করে ভিমের সাথে :

set encoding=latin1
set isprint=
set display+=uhex

এখানে চিত্র বর্ণনা লিখুন

অথবা, অন্যান্য উত্তরের পদ্ধতিগুলি মানিয়ে নেওয়া:

bash-4.4$ f() { cat -A "$@"; false; }   # exit false to prevent bash from running the command
bash-4.4$ VISUAL=f
bash-4.4$ [ -f /etc/openvpn/client.conf ] && echo true  # C-x C-e here
[ -f /etc/openvpn/client.confM-BM- ] && echo true$
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.