আমি এ নিয়ে গোল হয়ে ঘুরেছিলাম। নাল বাইটের বহনযোগ্যতার জন্য আমি হতাশ হয়ে পড়েছিলাম। আমার সাথে এটি ভালভাবে বসেনি যে তাদের শেলের মধ্যে হ্যান্ডেল করার কোনও নির্ভরযোগ্য উপায় নেই। তাই আমি তাকিয়ে রইলাম। সত্যটি হল আমি এটি করার বিভিন্ন উপায় খুঁজে পেয়েছি, এর মধ্যে কয়েকটি মাত্র আমার অন্যান্য উত্তরে উল্লিখিত রয়েছে। তবে ফলাফলগুলি হ'ল কমপক্ষে দুটি শেল ফাংশন যা এই ধরণের কাজ করে:
_pidenv ${psrc=$$} ; _zedlmt <$near_any_type_of_file
প্রথমে আমি \0
সীমানা সম্পর্কে কথা বলব এটি আসলে করা বেশ সহজ। ফাংশনটি এখানে:
_zedlmt() { od -t x1 -w1 -v | sed -n '
/.* \(..\)$/s//\1/
/00/!{H;b};s///
x;s/\n/\\x/gp;x;h'
}
মূলত প্রতিটি লাইনে হেক্সাডেসিমাল একটিতে এটি প্রাপ্ত প্রতিটি বাইট od
নিয়ে যায় stdin
এবং লিখতে থাকে stdout
।
printf 'This\0is\0a\0lot\0\of\0\nulls.' |
od -t x1 -w1 -v
#output
0000000 54
0000001 68
0000002 69
0000003 73
0000004 00
0000005 69
0000006 73
#and so on
আমি বাজি ধরছি আপনি অনুমান করতে পারবেন কোনটা \0null
, তাই না? এর বাইরে লিখিত এটি যে কোনও সঙ্গে পরিচালনা করা সহজ sed
। sed
কেবল প্রতিটি লাইনে শেষ দুটি অক্ষর সংরক্ষণ করুন যতক্ষণ না এটি একটি শূন্য মুখের মুখোমুখি হয় যেখানে এটি মধ্যবর্তী নিউলাইনগুলিকে printf
বন্ধুত্বপূর্ণ ফর্ম্যাট কোডের সাথে প্রতিস্থাপন করে এবং স্ট্রিংটি মুদ্রণ করে। ফলস্বরূপ \0null
হেক্স বাইট স্ট্রিংয়ের সীমানাযুক্ত অ্যারে। দেখুন:
printf %b\\n $(printf 'Fewer\0nulls\0here\0.' |
_zedlmt | tee /dev/stderr)
#output
\x46\x65\x77\x65\x72
\x6e\x75\x6c\x6c\x73
\x68\x65\x72\x65
\x2e
Fewer
nulls
here
.
আমি tee
উপরেরটি পাইপ করলাম যাতে আপনি কমান্ড সাসবস্টিটিউশনের আউটপুট এবং printf
এর প্রক্রিয়াজাতকরণের ফলাফল উভয়ই দেখতে পান । আমি আশা করি আপনি লক্ষ্য করবেন যে সাবশেলটি আসলে কোনওটি উদ্ধৃত হয়নি তবে printf
এখনও কেবল \0null
ডিলিমিটারে বিভক্ত হয়েছে। দেখুন:
printf %b\\n $(printf \
"Fe\n\"w\"er\0'nu\t'll\\'s\0h ere\0." |
_zedlmt | tee /dev/stderr)
#output
\x46\x65\x0a\x22\x77\x22\x65\x72
\x27\x6e\x75\x09\x27\x6c\x6c\x27\x73
\x68\x20\x20\x20\x20\x65\x72\x65
\x2e
Fe
"w"er
'nu 'll's
h ere
.
হয় সেই প্রসারণের কোনও উদ্ধৃতি নেই - আপনি এটি উদ্ধৃত করেন বা না করেন তা বিবেচ্য নয়। এর কারণ হ'ল দংশনের মানগুলি \n
প্রতিবার sed
স্ট্রিং প্রিন্ট করে এমন এক ewline ব্যতীত অপরিশোধিত হয়ে আসে । শব্দ বিভাজন প্রযোজ্য নয়। এবং এটিই এটি সম্ভব করে তোলে:
_pidenv() { ps -p $1 >/dev/null 2>&1 &&
[ -z "${1#"$psrc"}" ] && . /dev/fd/3 ||
cat <&3 ; unset psrc pcat
} 3<<STATE
$( [ -z "${1#${pcat=$psrc}}" ] &&
pcat='$(printf %%b "%s")' || pcat="%b"
xeq="$(printf '\\x%x' "'=")"
for x in $( _zedlmt </proc/$1/environ ) ; do
printf "%b=$pcat\n" "${x%%"$xeq"*}" "${x#*"$xeq"}"
done)
#END
STATE
উপরের ফাংশনটি _zedlmt
হয় ${pcat}
কোনও প্রসেসের পরিবেশগত উত্সকরণের জন্য বাইট কোডের একটি প্রস্তুত স্ট্রিম ব্যবহার করে /proc
বা .dot
${psrc}
বর্তমান শেলটিতে সরাসরি একইরূপে বা পরামিতি ছাড়াই টার্মিনালে একই প্রক্রিয়াজাত আউটপুট প্রদর্শন করতে ব্যবহার করে set
বা printenv
হবে। আপনার যা দরকার তা হ'ল $pid
- যে কোনও পাঠযোগ্য /proc/$pid/environ
ফাইল তা করবে।
আপনি এটি এর মতো ব্যবহার করুন:
#output like printenv for any running process
_pidenv $pid
#save human friendly env file
_pidenv $pid >/preparsed/env/file
#save unparsed file for sourcing at any time
_pidenv ${pcat=$pid} >/sourcable/env.save
#.dot source any pid's $env from any file stream
_pidenv ${pcat=$pid} | sh -c '. /dev/stdin'
#feed any pid's env in on a heredoc filedescriptor
su -c '. /dev/fd/4' 4<<ENV
$( _pidenv ${pcat=$pid} )
ENV
#.dot sources any $pid's $env in the current shell
_pidenv ${psrc=$pid}
তবে মানুষের বন্ধুত্বপূর্ণ এবং সসকেবলের মধ্যে পার্থক্য কী ? ঠিক আছে, এখানে পার্থক্য যা এই উত্তরটি এখানে অন্য প্রত্যেকটির চেয়ে আলাদা করে তোলে - আমার অন্যান্য উত্তর সহ। অন্যান্য প্রতিটি উত্তর সমস্ত প্রান্ত-কেসগুলি পরিচালনা করার জন্য কোনও উপায়ে শেল উদ্ধৃতি নির্ভর করে। এটি কেবল এটি ভাল কাজ করে না। আমাকে বিশ্বাস করুন - আমি চেষ্টা করেছি। দেখুন:
_pidenv ${pcat=$$}
#output
LC_COLLATE=$(printf %b "\x43")
GREP_COLOR=$(printf %b "\x33\x37\x3b\x34\x35")
GREP_OPTIONS=$(printf %b "\x2d\x2d\x63\x6f\x6c\x6f\x72\x3d\x61\x75\x74\x6f")
LESS_TERMCAP_mb=$(printf %b "\x1b\x5b\x30\x31\x3b\x33\x31\x6d")
LESS_TERMCAP_md=$(printf %b "\x1b\x5b\x30\x31\x3b\x33\x31\x6d")
LESS_TERMCAP_me=$(printf %b "\x1b\x5b\x30\x6d")
LESS_TERMCAP_se=$(printf %b "\x1b\x5b\x30\x6d")
LESS_TERMCAP_so=$(printf %b "\x1b\x5b\x30\x30\x3b\x34\x37\x3b\x33\x30\x6d")
LESS_TERMCAP_ue=$(printf %b "\x1b\x5b\x30\x6d")
কোন পরিমাণে মজাদার চরিত্র বা এতে থাকা উদ্ধৃতিগুলি এটিকে ভেঙে ফেলতে পারে না কারণ তাত্ক্ষণিকভাবে সামগ্রীর উত্স না পাওয়া পর্যন্ত প্রতিটি মানের বাইটগুলি মূল্যায়ন করা হয় না। এবং আমরা ইতিমধ্যে জানি এটি কমপক্ষে একবারে একটি মান হিসাবে কাজ করেছে - এখানে কোনও পার্সিং বা উদ্ধৃতি সুরক্ষা দরকার নেই কারণ এটি আসল মূল্যের বাইট-বাই-বাইট অনুলিপি।
ফাংশনটি প্রথমে $var
নামগুলি মূল্যায়ন করে এবং .dot
ফাইল-বর্ণনাকারী-এ-ডকটি এটি সরবরাহ করার আগে চেকগুলি সম্পন্ন হওয়ার জন্য অপেক্ষা করে 3.. এটি উত্সাহ দেওয়ার আগে এটি দেখতে এটির মতো দেখাচ্ছে। এটা বোকা-প্রমাণ। এবং পসিক্স পোর্টেবল। ভাল, কমপক্ষে ull 0 নাল হ্যান্ডলিংটি পসিক্স পোর্টেবল - / প্রক্রিয়া ফাইল সিস্টেম অবশ্যই লিনাক্স নির্দিষ্ট। এবং সেজন্য দুটি ফাংশন রয়েছে।
. <(xargs -0 bash -c 'printf "export %q\n" "$@"' -- < /proc/nnn/environ)
, যা এগুলিতে যথাযথভাবে উদ্ধৃতি সহ ভেরিয়েবলগুলি পরিচালনা করবে।