मैं किसी अन्य प्रक्रिया के पर्यावरण चर का स्रोत कैसे बनाऊं?


24

यदि मैं जांच करता /proc/1/environहूं तो मैं प्रक्रिया 1के पर्यावरण चर के एक अशक्त-बंटे हुए स्ट्रिंग को देख सकता हूं । मैं इन चरों को अपने वर्तमान परिवेश में लाना चाहता हूँ। क्या इसे करने का कोई आसान तरीका है?

procआदमी पेज मुझे एक टुकड़ा है जो एक पंक्ति-दर-पंक्ति आधार पर प्रत्येक वातावरण चर प्रिंट आउट हो मदद करता है देता है (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), जो उनके साथ ही ठीक से उद्धरण के साथ चर को संभाल लेंगे।
जॉन कुगेलमैन

@JohnKugelman सुधार के लिए बहुत बहुत धन्यवाद, "$@"इसके बजाय का उपयोग कर '{}'--अपने बेहतर उत्तर में तर्क के बारे में सोच रहे लोगों के लिए : स्थिति संबंधी तर्क को 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:जिसका अर्थ है "अशक्त बाइट्स पर विभाजित करें", और @अर्थ "यदि पूरी बात दोहरे उद्धरण चिह्नों में है - तो एक अलग क्षेत्र के रूप में प्रत्येक सरणी तत्व ”(सामान्यीकरण "$@")।)

बैश, mksh

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

(इन गोले में, एक खाली सीमांकक के readपरिणामस्वरूप नल बाइट्स विभाजक हो जाते हैं। मैं PWDअस्थायी चर नाम के रूप में एक अन्य चर को रोकने के लिए उपयोग करता हूं जो कि आयात किया जा सकता है। जबकि आप तकनीकी PWDरूप से भी आयात कर सकते हैं , यह केवल तब तक रखा जाएगा। अगले cd।)

POSIX

POSIX पोर्टेबिलिटी इस सवाल के लिए दिलचस्प नहीं है, क्योंकि यह केवल उन प्रणालियों पर लागू होता है जिनके पास है /proc/PID/environ। तो सवाल यह है कि सोलारिस सेड किसका समर्थन करता है - या क्या सोलारिस का /proc/PID/environउपयोग किया गया है , इसका उपयोग नहीं किया गया है , लेकिन मैं सोलारिस सुविधाओं पर वक्र के पीछे हूं, इसलिए यह आजकल हो सकता है। लिनक्स पर, जीएनयू उपयोगिताओं और बिजीबॉक्स दोनों शून्य-सुरक्षित हैं, लेकिन कैविटीज़ के साथ।

यदि हम POSIX पोर्टेबिलिटी पर जोर देते हैं, तो POSIX टेक्स्ट यूटिलिटीज में से किसी को भी नल बाइट्स को संभालने की आवश्यकता नहीं है, इसलिए यह मुश्किल है। यहाँ एक समाधान है जो मानता है कि awk एक अशक्त बाइट का समर्थन करता है जैसा कि रिकॉर्ड सीमांकक (nawk और gawk करते हैं, जैसा कि बिजीबॉक्स awk करता है, लेकिन mawk नहीं करता है)।

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

बिजीबॉक्स awk (आमतौर पर एम्बेडेड Linux सिस्टम पर पाया संस्करण है) समर्थन अशक्त बाइट्स लेकिन सेट नहीं करता है 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अनुकूल प्रारूप कोड के साथ मध्यवर्ती newlines को प्रतिस्थापित करता है और स्ट्रिंग को प्रिंट करता है। परिणाम \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किसी तार के निकलते हैं । शब्द-विभाजन लागू नहीं होता है। और यही संभव बनाता है:

_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. इससे पहले कि यह जैसा दिखता है, वैसा ही हो। यह मूर्खतापूर्ण है। और POSIX पोर्टेबल। ठीक है, कम से कम \ 0null हैंडलिंग POSIX पोर्टेबल है - / प्रक्रिया फ़ाइल सिस्टम स्पष्ट रूप से लिनक्स विशिष्ट है। और इसीलिए दो कार्य हैं।


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 के उत्तर में बेमानी है? कारण अगर यह बहुत महत्वपूर्ण नहीं लगता है
डेन ओ'कॉनर

हां, निर्यात की जरूरत है। मैं इसे ठीक कर दूंगा।
पावेल Paमरदा

3
ये सभी कमांड उन मानों पर चुटकी लेते हैं जिनमें नई वर्णमालाएँ होती हैं और (कमांड के आधार पर) अन्य वर्ण।
गाइल्स का SO- बुराई पर रोक '22

सही बात। संदर्भ के लिए जवाब वैसे भी रखेंगे।
पावेल Paमेरदा

3

यह ध्यान देने योग्य है कि प्रक्रियाओं में पर्यावरण चर हो सकते हैं जो मान्य बैश / श / * श चर नहीं हैं - POSIX अनुशंसा करता है लेकिन यह आवश्यक नहीं है कि पर्यावरण चर का नाम मिलान हो ^[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

मुझे लगता है कि यह POSIX पोर्टेबल है:

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

लेकिन @ गिल्स एक अच्छा बिंदु बनाता है - sedशायद नल को संभाल लेगा, लेकिन शायद नहीं। तो वहाँ यह है (मैं वास्तव में इस बार ऐसा लगता है) वास्तव में POSIX पोर्टेबल विधि, भी:

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

फिर भी, अगर आपको GNU मिल गया है तो आपको sedकेवल करने की आवश्यकता है:

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

  #BOTH METHODS OUTPUT:

यहाँ छवि विवरण दर्ज करें

ठीक है, POSIX पोर्टेबल जो इसके अलावा /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कथन आखिरी तक पहुंचने तक प्रत्येक पंक्ति को स्मृति में रखकर काम करता है, जिस समय यह एक वैश्विक प्रतिस्थापन को प्रदर्शित करता है, जिसमें न्यूली पर एंकरिंग करके, जहां पर नई सुर्खियों को उद्धृत और सम्मिलित करना होता है। वास्तव में बहुत आसान है।

में dashचित्र आप मैं \ गड़बड़ त्याग और कहा करने का विकल्प चुना देखेंगे GNUविशिष्ट -rकरने के लिए विकल्प sed। लेकिन यह सिर्फ कारण है कि यह टाइप करने के लिए कम था। यह किसी भी तरह से काम करता है, जैसा कि आप zshछवि में देख सकते हैं ।

यहाँ है zsh:

यहाँ छवि विवरण दर्ज करें

और यहाँ dashअलग-अलग काम कर रहे हैं:

यहाँ छवि विवरण दर्ज करें

यहां तक ​​कि टर्मिनल एस्केप अनसैक्ड के माध्यम से आते हैं:

यहाँ छवि विवरण दर्ज करें


यह POSIX-पोर्टेबल नहीं है क्योंकि null बाइट्स को संभालने के लिए sed की आवश्यकता नहीं है। (यह कहा जा रहा है, पोसिक्स पोर्टेबिलिटी इस सवाल के लिए दिलचस्प नहीं है, क्योंकि यह केवल उन प्रणालियों पर लागू होता है /proc/PID/environ। तो सवाल यह है कि सोलारिस सेड किसका समर्थन करता है - या सोलारिस का क्या है /proc/PID/environ, इसका उपयोग नहीं किया गया है , लेकिन मैं तरीका हूं सोलारिस पर वक्र के पीछे यह आजकल हो सकता है।)
गिल्स एसओ- बुराई को रोकें '

@ गिल्स नं। लेकिन एससी sedहेक्साडेसिमल को संभालने के लिए आवश्यक है, जिनमें से अशक्त बाइट एक है। इसके अलावा, मैं वास्तव में सिर्फ सोचा कि अगर यह अभी भी एक बहुत आसान तरीका है।
मिकसरोव

नहीं, POSIX का कहना है कि "इनपुट फाइलें पाठ फाइलें होंगी" (सेड और अन्य पाठ उपयोगिताओं के लिए) और पाठ फ़ाइलों को "फ़ाइल में एक या अधिक लाइनों में व्यवस्थित वर्णों वाली" के रूप में परिभाषित करता है । लाइनों में NUL वर्ण (…) नहीं हैं ”। और वैसे \xNNPOSIX में सिंटैक्स की आवश्यकता नहीं है, यहां तक ​​कि \OOOओक्टल सिंटैक्स (सी स्ट्रिंग्स में और awk, हाँ, लेकिन सीड रीजैक्स में नहीं)।
गिल्स एसओ- बुराई को रोकें '

@Gilles आपको एक बिंदु मिल गया है। मैंने सभी को देखा और मुझे नहीं मिला कि मैंने जो सोचा था, मैं उससे पहले कर सकता हूं। इसलिए मैंने इसे अलग तरीके से किया। अब संपादन कर रहे हैं।
मिकसेर्व

जहाँ तक मैं बता सकता हूँ, Solaris के पास /proc/PID/environआखिर नहीं है (इसमें कई अन्य लिनक्स जैसी प्रविष्टियाँ हैं /proc/PID, लेकिन नहीं environ)। तो एक पोर्टेबल समाधान को लिनक्स उपकरणों से परे जाने की आवश्यकता नहीं है, जिसका अर्थ है कि GNU sed या बिजीबॉक्स sed। दोनों \x00एक regexp में समर्थन करते हैं , इसलिए आपका कोड आवश्यकतानुसार पोर्टेबल है (लेकिन POSIX नहीं)। यह अत्यधिक जटिल है, हालांकि।
गिलेस एसओ- बुराई को रोकना '

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.