आप अपने शेल को हमेशा अनुप्रयोगों को बता सकते हैं कि शेल कोड उनके निष्पादन के लिए क्या नेतृत्व करता है। उदाहरण के लिए, हुक का उपयोग करके पर्यावरण चर zsh
में उस जानकारी को पास $SHELL_CODE
करके preexec()
( printenv
उदाहरण के रूप में, आप getenv("SHELL_CODE")
अपने कार्यक्रम में उपयोग करेंगे ):
$ preexec() export SHELL_CODE=$1
$ printenv SHELL_CODE
printenv SHELL_CODE
$ printenv SHELL_CODE
printenv CODE
$ $(echo printenv SHELL_CODE)
$(echo printenv SHELL_CODE)
$ for i in SHELL_CODE; do printenv "$i"; done
for i in SHELL_CODE; do printenv "$i"; done
$ printenv SHELL_CODE; : other command
printenv SHELL_CODE; : other command
$ f() printenv SHELL_CODE
$ f
f
उन सभी के printenv
रूप में निष्पादित करेंगे:
execve("/usr/bin/printenv", ["printenv", "SHELL_CODE"],
["PATH=...", ..., "SHELL_CODE=..."]);
उन तर्कों printenv
के printenv
साथ निष्पादन के लिए नेतृत्व करने वाले zsh कोड को पुनः प्राप्त करने की अनुमति । आप उस जानकारी के साथ क्या करना चाहेंगे, यह मेरे लिए स्पष्ट नहीं है।
साथ bash
, सुविधा के लिए निकटतम zsh
की preexec()
अपनी का उपयोग करेंगे $BASH_COMMAND
एक में DEBUG
जाल है, लेकिन ध्यान दें कि bash
कि में पुनर्लेखन (और विशेष रूप refactors में सीमांकक के रूप में इस्तेमाल करने से व्हाइटस्पेस से कुछ) और कहा कि हर के लिए आवेदन किया (अच्छी तरह से, कुछ) के कुछ स्तर करता आदेश पूरी कमांड लाइन को प्रॉम्प्ट पर दर्ज करते समय चलाएं ( functrace
विकल्प भी देखें )।
$ trap 'export SHELL_CODE="$BASH_COMMAND"' DEBUG
$ printenv SHELL_CODE
printenv SHELL_CODE
$ printenv $(echo 'SHELL_CODE')
printenv $(echo 'SHELL_CODE')
$ for i in SHELL_CODE; do printenv "$i"; done; : other command
printenv "$i"
$ printf '%s\n' "$(printenv "SHELL_CODE")"
printf '%s\n' "$(printenv "SHELL_CODE")"
$ set -o functrace
$ printf '%s\n' "$(printenv "SHELL_CODE")"
printenv "SHELL_CODE"
$ print${-+env } $(echo 'SHELL_CODE')
print${-+env } $(echo 'SHELL_CODE')
देखें कि शेल भाषा सिंटैक्स में परिसीमन करने वाले कुछ रिक्त स्थान को 1 में निचोड़ दिया गया है और कैसे पूरी कमांड लाइन को हमेशा कमांड में पारित नहीं किया जाता है। तो शायद आपके मामले में उपयोगी नहीं है।
ध्यान दें कि मैं इस तरह की बात करने की सलाह नहीं दूंगा, क्योंकि आप संभावित रूप से प्रत्येक कमांड के लिए संवेदनशील जानकारी लीक कर रहे हैं:
echo very_secret | wc -c | untrustedcmd
उस रहस्य को दोनों के लिए wc
और लीक करेगा untrustedcmd
।
बेशक, आप शेल की तुलना में अन्य भाषाओं के लिए उस तरह का काम कर सकते थे। उदाहरण के लिए, C में, आप कुछ मैक्रोज़ का उपयोग कर सकते हैं जो C कोड को निर्यात करते हैं जो पर्यावरण के लिए एक कमांड निष्पादित करता है:
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#define WRAP(x) (setenv("C_CODE", #x, 1), x)
int main(int argc, char *argv[])
{
if (!fork()) WRAP(execlp("printenv", "printenv", "C_CODE", NULL));
wait(NULL);
if (!fork()) WRAP(0 + execlp("printenv", "printenv", "C_CODE", NULL));
wait(NULL);
if (argc > 1 && !fork()) WRAP(execvp(argv[1], &argv[1]));
wait(NULL);
return 0;
}
उदाहरण:
$ ./a.out printenv C_CODE
execlp("printenv", "printenv", "C_CODE", NULL)
0 + execlp("printenv", "printenv", "C_CODE", NULL)
execvp(argv[1], &argv[1])
देखें कि कैसे कुछ स्थानों को सी प्री-प्रोसेसर द्वारा संघनित किया गया जैसे बैश केस में। अधिकांश में यदि सभी भाषाएं नहीं हैं, तो सीमांकक में प्रयुक्त अंतरिक्ष की मात्रा में कोई फर्क नहीं पड़ता है, इसलिए यह आश्चर्य की बात नहीं है कि संकलक / दुभाषिया यहां उनके साथ कुछ स्वतंत्रता लेते हैं।