আপনি সর্বদা আপনার শেলকে অ্যাপ্লিকেশনগুলি বলতে শেল কোডটি কার্যকর করার ক্ষেত্রে নেতৃত্ব দেয় তা বলতে পারেন। উদাহরণস্বরূপ, হুক ব্যবহার করে পরিবেশের ভেরিয়েবলের 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
Zsh কোডটি পুনরুদ্ধার করার অনুমতি দিচ্ছে 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