আপনি সর্বদা আপনার শেলকে অ্যাপ্লিকেশনগুলি বলতে শেল কোডটি কার্যকর করার ক্ষেত্রে নেতৃত্ব দেয় তা বলতে পারেন। উদাহরণস্বরূপ, হুক ব্যবহার করে পরিবেশের ভেরিয়েবলের 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=..."]);
printenvZsh কোডটি পুনরুদ্ধার করার অনুমতি দিচ্ছে printenvযা সেই যুক্তি দিয়ে কার্যকর করতে পারে। আপনি এই তথ্যটি দিয়ে কী করতে চান তা আমার কাছে পরিষ্কার নয়।
সঙ্গে bash, বৈশিষ্ট্য নিকটস্থ zshএর preexec()তার ব্যবহার করা হবে $BASH_COMMANDএকটি DEBUGফাঁদ, কিন্তু মনে রাখবেন যে bashযে rewriting (এবং বিশেষ 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।
অবশ্যই, আপনি শেল বাদে অন্য ভাষার জন্য এই জাতীয় জিনিস করতে পারেন। উদাহরণস্বরূপ, সি-তে আপনি এমন কিছু ম্যাক্রোগুলি ব্যবহার করতে পারেন যা সি কোড রফতানি করে যা পরিবেশে একটি আদেশ কার্যকর করে:
#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])
বাশ মামলার মতো সি প্রাক প্রসেসর দ্বারা কীভাবে কিছু স্থান ঘনীভূত হয়েছিল তা দেখুন। বেশিরভাগ ক্ষেত্রেই সমস্ত ভাষা না থাকলে, ডিলিমিটারগুলিতে ব্যবহৃত জায়গার পরিমাণ কোনও পার্থক্য করে না, তাই সংকলক / দোভাষী এখানে তাদের সাথে কিছুটা স্বাধীনতা নিয়ে অবাক হন না not