এটি তুচ্ছ সমস্যা নয়। শেলটি ফাংশনটি কল করার আগে উদ্ধৃতি অপসারণ সম্পাদন করে, সুতরাং ফাংশনটি আপনি যেমন টাইপ করেছেন ঠিক তেমনভাবে পুনরায় তৈরি করার কোনও উপায় নেই।
তবে, আপনি যদি কমান্ডটি পুনরায় পাঠাতে কেবল অনুলিপি করতে এবং একটি কমানোর আটকানো স্ট্রিং মুদ্রণ করতে সক্ষম হতে চান তবে দুটি ভিন্ন পদ্ধতির আপনি নিতে পারেন:
- মাধ্যমে চালিত হতে একটি কমান্ড স্ট্রিং তৈরি করুন
eval
এবং সেই স্ট্রিংটি পাস করুনdry_run
dry_run
মুদ্রণের আগে কমান্ডের বিশেষ অক্ষরগুলি উদ্ধৃত করুন
ব্যবহার eval
আপনি eval
কী চালাচ্ছেন তা মুদ্রণের জন্য আপনি কীভাবে এটি ব্যবহার করতে পারেন তা এখানে:
dry_run() {
printf '%s\n' "$1"
[ -z "${DRY_RUN}" ] || return 0
eval "$1"
}
email_admin() {
echo " Emailing admin"
dry_run 'su - '"$target_username"' -c "cd '"$GIT_WORK_TREE"' && git log -1 -p|mail -s '"'$mail_subject'"' '"$admin_email"'"'
echo " Emailed"
}
আউটপুট:
su - webuser1 -c "cd /home/webuser1/public_html && git log -1 -p|mail -s 'Git deployment on webuser1' user@domain.com"
উদ্ধৃতি দেওয়ার পাগল পরিমাণটি নোট করুন - আপনি একটি কমান্ডের মধ্যে একটি কমান্ডের মধ্যে একটি কমান্ড পেয়েছেন, যা দ্রুত কুৎসিত হয়। সাবধান: উপরের কোডটিতে সমস্যা হবে যদি আপনার ভেরিয়েবলগুলিতে শ্বেত স্থান বা বিশেষ অক্ষর (কোটের মতো) থাকে।
বিশেষ অক্ষর উদ্ধৃতি
এই পদ্ধতির সাহায্যে আপনি কোডটি আরও স্বাভাবিকভাবে লিখতে সক্ষম হন, তবে দ্রুত এবং নোংরা উপায়টি shell_quote
বাস্তবায়িত হওয়ায় মানুষের পক্ষে আউটপুটটি পড়া শক্ত হয়:
# This function prints each argument wrapped in single quotes
# (separated by spaces). Any single quotes embedded in the
# arguments are escaped.
#
shell_quote() {
# run in a subshell to protect the caller's environment
(
sep=''
for arg in "$@"; do
sqesc=$(printf '%s\n' "${arg}" | sed -e "s/'/'\\\\''/g")
printf '%s' "${sep}'${sqesc}'"
sep=' '
done
)
}
dry_run() {
printf '%s\n' "$(shell_quote "$@")"
[ -z "${DRY_RUN}" ] || return 0
"$@"
}
email_admin() {
echo " Emailing admin"
dry_run su - "${target_username}" -c "cd $GIT_WORK_TREE && git log -1 -p|mail -s '$mail_subject' $admin_email"
echo " Emailed"
}
আউটপুট:
'su' '-' 'webuser1' '-c' 'cd /home/webuser1/public_html && git log -1 -p|mail -s '\''Git deployment on webuser1'\'' user@domain.com'
আপনি shell_quote
একক উদ্ধৃতিতে সমস্ত কিছু মোড়কে না রেখে ব্যাকস্ল্যাশ-এস্কেপ বিশেষ চরিত্রে পরিবর্তন করে আউটপুটটির পঠনযোগ্যতা উন্নত করতে পারেন , তবে এটি সঠিকভাবে করা শক্ত।
আপনি যদি এই shell_quote
পদ্ধতিটি করেন, আপনি su
নিরাপদ উপায়ে কমান্ডটি তৈরি করতে পারেন । নিম্নলিখিত কাজ এমনকি যদি হবে ${GIT_WORK_TREE}
, ${mail_subject}
অথবা ${admin_email}
বিশেষ অক্ষর (একক উদ্ধৃতি, স্পেস, আস্টেরিক্স, সেমিকোলন, ইত্যাদি) অন্তর্ভুক্ত:
email_admin() {
echo " Emailing admin"
cmd=$(
shell_quote cd "${GIT_WORK_TREE}"
printf '%s' ' && git log -1 -p | '
shell_quote mail -s "${mail_subject}" "${admin_email}"
)
dry_run su - "${target_username}" -c "${cmd}"
echo " Emailed"
}
আউটপুট:
'su' '-' 'webuser1' '-c' ''\''cd'\'' '\''/home/webuser1/public_html'\'' && git log -1 -p | '\''mail'\'' '\''-s'\'' '\''Git deployment on webuser1'\'' '\''user@domain.com'\'''