আমি অন্য প্রক্রিয়াটির পরিবেশের পরিবর্তনশীলগুলি কীভাবে উত্স করব?


24

যদি আমি পরীক্ষা /proc/1/environকরি তবে আমি প্রক্রিয়াটির 1পরিবেশের ভেরিয়েবলগুলির নাল-বাইট-সীমানাঙ্কিত স্ট্রিংটি দেখতে পাচ্ছি । আমি এই বর্তমানগুলি আমার বর্তমান পরিবেশে আনতে চাই। এটি করার কোনও সহজ উপায় আছে?

procMan পৃষ্ঠা আমাকে একটা স্নিপেট যা একটি লাইন বাই লাইন ভিত্তিতে প্রতিটি এনভায়রনমেন্ট ভেরিয়েবল প্রিন্ট আউট করা সাহায্য করে দেয় (cat /proc/1/environ; echo) | tr '\000' '\n'। এটি আমাকে লিখিত সামগ্রীগুলি সঠিক তা যাচাই করতে সহায়তা করে, তবে আমার সত্যিই যা করা দরকার তা হল আমার বর্তমান বাশ সেশনে এই পরিবর্তনশীলগুলির উত্স।

আমি কেমন করে ঐটি করি?

উত্তর:


23

নীচে প্রতিটি পরিবেশের পরিবর্তনশীলকে একটি exportবিবৃতিতে রূপান্তরিত করবে, শেলতে পড়ার জন্য সঠিকভাবে উদ্ধৃত করা হয়েছে (কারণ LS_COLORS, উদাহরণস্বরূপ, এতে সেমিকোলন সম্ভবত রয়েছে), তারপরে এটি উত্স করে।

[ printfইন /usr/bin, দুর্ভাগ্যক্রমে, সাধারণত সমর্থন করে না %q, তাই আমাদের অন্তর্নির্মিত একটিকে কল করা দরকার bash]]

. <(xargs -0 bash -c 'printf "export %q\n" "$@"' -- < /proc/nnn/environ)

আমি প্রস্তাব দিচ্ছি . <(xargs -0 bash -c 'printf "export %q\n" "$@"' -- < /proc/nnn/environ), যা এগুলিতে যথাযথভাবে উদ্ধৃতি সহ ভেরিয়েবলগুলি পরিচালনা করবে।
জন কুগেলম্যান

@ জনকুগেলম্যান "$@"পরিবর্তে ব্যবহার করে উন্নতির জন্য আপনাকে অনেক ধন্যবাদ '{}'--তার উন্নত উত্তরে যুক্তি সম্পর্কে যারা ভাবছেন তাদের জন্য : অবস্থানগত আর্গুমেন্টগুলি bash -c command_stringশুরু হতে বরাদ্দ করা হবে $0, যখন "$@"প্রারম্ভিক যুক্তিগুলি অন্তর্ভুক্ত করার জন্য প্রসারিত হবে $1। যুক্তি --নির্ধারিত হয় $0
মার্ক প্লটনিক

10

ইন bashআপনি নিম্নলিখিতগুলি করতে পারেন। এটি ভেরিয়েবল এবং সম্ভাব্য সমস্ত সম্ভাব্য সামগ্রীর জন্য কাজ করবে eval:

while IFS= read -rd '' var; do declare +x "$var"; done </proc/$PID/environ

এটি চলমান শেলের শেল ভেরিয়েবল হিসাবে পঠিত ভেরিয়েবলগুলি ঘোষণা করবে। পরিবর্তে চলমান শেল পরিবেশে ভেরিয়েবলগুলি রফতানি করতে:

while IFS= read -rd '' var; do export "$var"; done </proc/$PID/environ

10

এই উত্তরে আমি এমন একটি সিস্টেম ধরে নিয়েছি যেখানে /proc/$pid/environনির্দিষ্ট পিআইডি দিয়ে প্রক্রিয়াটির পরিবেশটি পরিবর্তনশীল সংজ্ঞাগুলির মধ্যে নাল বাইট সহ প্রদান করে। ( সুতরাং লিনাক্স, সাইগউইন বা সোলারিস (?) )।

Zsh

export "${(@ps:\000:)$(</proc/$pid/environ)}"

(Zsh যেমন সুন্দর সহজ যায়: একটি কোন কমান্ড ইনপুট ফেরৎ <FILE সমতূল্য cat FILEসঙ্গে কমান্ড প্রতিকল্পন ক্ষয়ের প্যারামিটার সম্প্রসারণ আউটপুট। পতাকা ps:\000: "নাল বাইটে বিভক্ত" অর্থ , এবং এর @অর্থ "যদি পুরো জিনিসটি ডাবল কোটে থাকে তবে চিকিত্সা করুন প্রতিটি অ্যারে উপাদান পৃথক ক্ষেত্র হিসাবে ”(সাধারণীকরণ "$@"))

বাশ, ম্যাক্স

while IFS= read -r -d "" PWD; do export "$PWD"; done </proc/$pid/environ
PWD=$(pwd)

(এই শেলগুলিতে, একটি খালি ডিলিমিটারটি readনাল বাইটগুলি পৃথককারী PWDহিসাবে পৌঁছে দেয় IPWD , তবে এটি কেবল অবধি স্থায়ী থাকবে) পরবর্তী cd।)

POSIX

পসিক্স বহনযোগ্যতা এই প্রশ্নের জন্য আকর্ষণীয় নয়, কারণ এটি কেবলমাত্র এমন সিস্টেমে প্রযোজ্য /proc/PID/environ। সুতরাং প্রশ্নটি সোলারিস সেড কী সমর্থন করে - বা সোলারিস আছে কিনা /proc/PID/environতা ব্যবহার করা হয়নি তবে আমি সোলারিসের বৈশিষ্ট্যগুলিতে বক্ররেখার পিছনে আছি তাই এটি আজকাল হতে পারে। লিনাক্সে, জিএনইউ ইউটিলিটিস এবং ব্যাসিবক্স উভয়ই নাল-নিরাপদ তবে ক্যাভেটস সহ।

যদি আমরা পসিক্স বহনযোগ্যতার জন্য জোর দিয়ে থাকি তবে নਾਲ বাইটগুলি হ্যান্ডল করার জন্য কোনও পসিক্স পাঠ্য ইউটিলিটি প্রয়োজন হয় না, তাই এটি কঠিন। এখানে এমন একটি সমাধান রয়েছে যা ধরে নিয়েছে যে জাগ রেকর্ড ডিলিমিটার হিসাবে নাল বাইটকে সমর্থন করে (নকি এবং গাক করেন, যেমন ব্যাসিবক্সও অবাক হয়, তবে মাক না করে)।

eval $(</proc/$pid/environ awk -v RS='\0' '{gsub("\047", "\047\\\047\047"); print "export \047" $0 "\047"}')

Busybox awk (সাধারণত এমবেডেড লিনাক্স সিস্টেম পাওয়া সংস্করণ যা) সমর্থন নাল বাইট কিন্তু সেটিং না RSকরতে "\0"একটি BEGINব্লক এবং উপরে না কমান্ড-লাইন সিন্টেক্স; তবে এটি সমর্থন করে -v 'RS="\0"'। আমি কেন তদন্ত করে দেখিনি, এটি আমার সংস্করণে (বাগানের দেবী হুইজি) মতো মনে হচ্ছে।

(সমস্ত রেখাগুলি নাল-বিচ্ছিন্ন রেকর্ডগুলিকে একক উদ্ধৃতিতে মোড়ানো করুন "\047", মানগুলির মধ্যে একক উদ্ধৃতি থেকে বেরিয়ে আসার পরে))

আদেশ সহকারে

সাবধান থাকুন যে এগুলির যে কোনওটি কেবল পঠনযোগ্য ভেরিয়েবলগুলি সেট করার চেষ্টা করতে পারে (যদি আপনার শেলটিতে কেবল পঠনযোগ্য ভেরিয়েবল থাকে)।


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

6

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

_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, তাই না? এর বাইরে লিখিত এটি যে কোনও সঙ্গে পরিচালনা করা সহজ sedsedকেবল প্রতিটি লাইনে শেষ দুটি অক্ষর সংরক্ষণ করুন যতক্ষণ না এটি একটি শূন্য মুখের মুখোমুখি হয় যেখানে এটি মধ্যবর্তী নিউলাইনগুলিকে 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 নাল হ্যান্ডলিংটি পসিক্স পোর্টেবল - / প্রক্রিয়া ফাইল সিস্টেম অবশ্যই লিনাক্স নির্দিষ্ট। এবং সেজন্য দুটি ফাংশন রয়েছে।


3

বিকল্প ব্যবহার sourceএবং প্রক্রিয়া :

source <(sed -r -e 's/([^\x00]*)\x00/export \1\n/g' /proc/1/environ)

কিছুদিন:

. <(sed -r -e 's/([^\x00]*)\x00/export \1\n/g' /proc/1/environ)

বিকল্প ব্যবহার evalএবং কমান্ড :

eval `sed -r -e 's/([^\x00]*)\x00/export \1\n/g' /proc/1/environ`

sedকল করবেন তা একটি সঙ্গে প্রতিস্থাপিত হতে পারে awkকল:

awk -vRS='\x00' '{ print "export", $0 }' /proc/1/environ

তবে ভুলে যাবেন না যে এটি কোনও পরিবেশের ভেরিয়েবলগুলি পিড 1 এ পরিষ্কার করছে না।


@ Fr00tyl00p এর উত্তরে রফতানি কি অপ্রয়োজনীয়? এটি যদি গুরুত্বপূর্ণ না মনে হয় তবে কারণ
ডেন ও'কনোর

হ্যাঁ, রফতানি দরকার। আমি এটা ঠিক করব।
পাভেল Šিমেরদা

3
এই সমস্ত কমান্ড নতুন মান এবং (কমান্ডের উপর নির্ভর করে) অন্যান্য অক্ষর ধারণ করে এমন মানগুলিতে শ্বাসরোধ করে।
গিলস 'খারাপ হয়ে যাওয়া বন্ধ করুন'

সঠিক। উত্তর যাইহোক রেফারেন্সের জন্য রাখবে।
পাভেল rdিমেরদা

3

এটি লক্ষণীয় যে প্রসেসগুলির মধ্যে পরিবেশের ভেরিয়েবলগুলি বৈধ বাশ / শ / * শ ভেরিয়েবলগুলি নাও থাকতে পারে - পসিক্স সুপারিশ করে তবে পরিবেশের ভেরিয়েবলের নামের সাথে মিলে যাওয়ার প্রয়োজন নেই ^[a-zA-Z0-9_][a-zA-Z0-9_]*$

অপারেটিং সিস্টেমের পরিবেশের সাথে শেলের সাথে সামঞ্জস্যপূর্ণ ভেরিয়েবলের তালিকা তৈরি করতে, ব্যাশে:

function env_from_proc {
  local pid="$1" skipped=( )
  cat /proc/"$pid"/environ | while read -r -d "" record
  do
    if [[ $record =~ ^[a-zA-Z_][a-zA-Z0-9_]*= ]]
    then printf "export %q\n" "$record"
    else skipped+=( "$record" )
    fi
  done
  echo "Skipped non-shell-compatible vars: ${skipped[@]%%=*}" >&2
}

একইভাবে, এগুলি লোড করতে:

function env_from_proc {
  local pid="$1" skipped=( )
  while read -r -d "" record
  do
    if [[ $record =~ ^[a-zA-Z_][a-zA-Z0-9_]*= ]]
    then export "$(printf %q "$record")"
    else skipped+=( "$record" )
    fi
  done < /proc/"$pid"/environ
  echo "Skipped non-shell-compatible vars: ${skipped[@]%%=*}" >&2
}

এই সমস্যাটি কেবল মাঝে মধ্যেই আসে তবে যখন তা ঘটে ...


0

আমি মনে করি এটি পসিএক্স পোর্টেবল:

. <<ENV /dev/stdin
    $(sed -n 'H;${x;s/\(^\|\x00\)\([^=]*.\)\([^\x00]*\)/\2\x27\3\x27\n/gp}' \
       /proc/$pid/environ)
ENV

তবে @ গিলিস একটি ভাল বক্তব্য রাখে - sedসম্ভবত নালগুলি পরিচালনা করবে, তবে সম্ভবত তা করবে না। সুতরাং এটি আছে (আমি সত্যিই এই সময়টি মনে করি) আসলে পসিক্স পোর্টেবল পদ্ধতিও:

s=$$SED$$
sed 's/'\''/'$s'/;1s/^./'\''&/' </proc/"$$"/environ |
tr '\0' "'" |
sed 's/'\''/&\n&/g' |
sed '1d;$d;s/^\('\''\)\([^=]*.\)/\2\1/;s/'$s'/'\\\''/g'

তবুও, আপনি যদি জিএনইউ পেয়ে থাকেন তবে আপনার sedকেবলমাত্র এটি করতে হবে:

sed -z 's/^[^=]*./&'\''/;s/$/'\''\n/' </proc/"$$"/environ

  #BOTH METHODS OUTPUT:

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

ওয়েল, পসিক্স পোর্টেবল /dev/...যা নির্দিষ্ট করা হয়নি তা ব্যতীত তবে আপনি বেশিরভাগ ইউনিসিতে সিনট্যাক্সের সাথে একই আচরণ করার আশা করতে পারেন।

এখন এটির সাথে যদি আপনার অন্যান্য প্রশ্নের কোনও সম্পর্ক থাকে তবে আপনি এটি এটির মতো ব্যবহার করতে পছন্দ করতে পারেন:

nsenter -m -u -i -n -p -t $PID /bin/bash 5<<ENV --rcfile=/dev/fd/5 
    $(sed -z 's/^[^=]*./&'\''/;s/$/'\''\n/' </proc/"$$"/environ)
ENV

এখানে-ডকটি অত্যন্ত সহায়ক যে এটি শেলটি .dotহস্তান্তর করতে এত পরিশ্রম করে আমাদের সাবলেটতে হ্যান্ডেল করার জন্য যে কোনও উদ্ধৃতি দিয়ে শেলটিকে স্ক্রু করা থেকে বিরত রাখে এবং আমাদের আবার একটি সাবসেল বা শেল না দিয়ে উত্সযোগ্য ফাইলের একটি নির্ভরযোগ্য পথ সরবরাহ করে পরিবর্তনশীল। এখানে অন্যরা <(process substitution)বাশিসম ব্যবহার করে যা অনেক একইভাবে কাজ করে - কেবল এটি অবশ্যই একটি বেনাম যেখানে পসিক্স |pipeকেবলমাত্র iohereএখানে-ডক্সের জন্য একটি নির্দিষ্ট করে এবং তাই এটি কোনও ধরণের ফাইল হতে পারে, যদিও বাস্তবে এটি সাধারণত একটি tempফাইল। ( dash,অন্যদিকে, |pipesএখানে-ডক্সের জন্য বেনাম ব্যবহার করে ) । প্রক্রিয়া প্রতিস্থাপনের ক্ষেত্রে দুর্ভাগ্যজনক বিষয়টি এটি হ'ল এটিও শেল নির্ভর - এটি যদি আপনি কাজ করছেন তবে বিশেষত বিরক্তিকর সমস্যা হতে পারে init

এটি |pipesঅবশ্যই কাজ করে , তবে তারপরে আপনি যখন পরিবেশটি আবার |pipe'sসাবস্কেল দিয়ে বাষ্পীভবন করেন তখন আপনি আবার পরিবেশটি হারাবেন । আবার, এটি কাজ করে:

sed '...;a\exec <>/dev/tty' /proc/$pid/environ | sh -i 

দ্য sedবিবৃতি নিজেই পর্যন্ত এটি গত ছুঁয়েছে মেমরি যে লাইন অধিষ্ঠিত, যা সময়ে এটি সঞ্চালিত একটি বিশ্বব্যাপী উদ্ধৃত এবং ঢোকাতে নতুন লাইন হ্যান্ডলিং প্রতিস্থাপন করে কাজ করে যেখানে NULLs উপর নোঙ্গরকরণ দ্বারা উপযুক্ত। মোটামুটি সহজ।

ইন dashছবি আপনাকে আমি \ জগাখিচুড়ি পরিহার এবং যোগ করেছেন, নির্বাচিত দেখতে পাবেন GNUনির্দিষ্ট -rকরার অপশন sed। কিন্তু এটি কারণ এটি টাইপ কম ছিল। এটি যে কোনও উপায়ে কাজ করে, যেমন আপনি দেখতে পাচ্ছেনzsh ইমেজে ।

এখানে zsh:

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

এবং এখানে dashবিভিন্ন একই জিনিস করছেন:

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

এমনকি টার্মিনাল পলায়নগুলি অনাবৃত through

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


এটি পসিক্স-পোর্টেবল নয় কারণ নাল বাইটগুলি হ্যান্ডেল করার প্রয়োজন নেই। (এই হচ্ছে বললেন, POSIX বহনযোগ্যতা, যে এই প্রশ্নের জন্য আকর্ষণীয় নয় কারণ এটি শুধুমাত্র সিস্টেম আছে প্রযোজ্য /proc/PID/environতাই প্রশ্ন কি সোলারিস sed সমর্থন করে -। অথবা সোলারিস হয়েছে /proc/PID/environ, এটি ব্যবহার করেননি কিন্তু আমি পথ আছি পিছনে সোলারিস উপর বক্ররেখা অতিরিক্ত বৈশিষ্ট্যগুলিও উপস্থিত রয়েছে, তাই এটি আজকাল পারে)।
গিলেজ 'SO- স্টপ হচ্ছে মন্দ'

@ গিলস নং তবে এসকি sedহেক্সাডেসিমাল পরিচালনা করতে হবে, যার মধ্যে নাল বাইট এক। তদ্ব্যতীত, আমি আসলেই ভেবেছিলাম যদি এখনও এটি করার কোনও আরও সহজ উপায়।
মাইকজার্ভ

না, পসিক্স বলে যে "ইনপুট ফাইলগুলি পাঠ্য ফাইল হবে" (সেড এবং অন্যান্য পাঠ্য ইউটিলিটিগুলির জন্য) এবং পাঠ্য ফাইলগুলিকে "এমন ফাইল হিসাবে সংজ্ঞা দেয় যা এক বা একাধিক লাইনে বিভক্ত অক্ষর ধারণ করে। লাইনে NUL টি অক্ষর নেই (…) ”। এবং যেভাবে পিসিক্সে \xNNসিনট্যাক্সের প্রয়োজন হয় না, এমনকি \OOOঅক্টাল সিনট্যাক্সেরও নয় (সি স্ট্রিংগুলিতে এবং জাজে, হ্যাঁ, তবে সেড রেজেক্সপসে নয়)।
গিলস'স'-দুষ্ট হওয়া বন্ধ করুন '

@ গিলস আপনি একটি পয়েন্ট পেয়েছেন আমি সমস্ত দিকে তাকিয়েছিলাম এবং আমি আগে যা করতে পারি তা ভেবে পাইনি। তাই আমি এটি অন্যভাবে করেছি। এখন সম্পাদনা করা হচ্ছে।
মাইকজার্ভ

আমি যতদূর বলতে পারি, সোলারিসের /proc/PID/environসব পরে নেই (এটিতে লিনাক্সের মতো আরও বেশ কয়েকটি এন্ট্রি রয়েছে /proc/PID, তবে নেই environ)। সুতরাং কোনও পোর্টেবল সমাধানের পরে লিনাক্স সরঞ্জামগুলি অতিক্রম করার দরকার নেই, মানে জিএনইউ সেড বা ব্যজিবক্স সেড। উভয়ই \x00একটি রিজেক্সেপে সমর্থন করে, সুতরাং আপনার কোডটি প্রয়োজনীয় হিসাবে পোর্টেবল (তবে পসিক্স নয়)। যদিও এটি অত্যধিক জটিল।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.