جایگزینی فرمان، خروجی یک فرمان [1] یا حتی چندین فرمان را دوباره تخصیص میدهد، یعنی خروجی فرمان را بدون کم و کاست به یک مضمون دیگر متصل میکند. [2]
شکل کلاسیک جایگزینی فرمان، از نقلقولهای برعکس (`...`) استفاده میکند. فرمانهای داخل نقلقولهای برعکس (backticks) متن سطرفرمان به وجود میآورند.
script_name=`basename $0` echo "The name of this script is $script_name."
خروجی فرمان میتواند به عنوان شناسههای یک فرمان دیگر، برای تنظیم یک متغیر، و حتی برای تولید لیست شناسهها در یک حلقه for به کار برود.
rm `cat filename` #"filename" شامل لیستی از فایلها جهت حذف شدن است. # #S. C. اشاره میکند که ممکن است به خطای "arg list too long" منجر بشود. #xargs rm -- < filename مناسبتر است. #( -- آن مواردی را پوشش میدهد که در آنها "filename" با یک "-" شروع میشود ) textfile_listing=`ls *.txt` #متغیر شامل نام تمام فایلهای *.txt در دایرکتوری جاری میشود. echo $textfile_listing textfile_listing2=$(ls *.txt) # echo $textfile_listing2 # # # # # # # # # #با تشکر از S.C.
جایگزینی فرمان یک پوسته فرعی احضار میکند. |
جایگزینی فرمان ممکن است منجر به تفکیک کلمه بشود. COMMAND `echo a b` # حتی موقعی که تفکیک کلمه وجود ندارد، جایگزینی فرمان میتواند سطرهای جدید دنباله را حذف کند. ## # mkdir 'dir with trailing newline ' cd 'dir with trailing newline ' cd "`pwd`" # # cd "$PWD" # old_tty_setting=$(stty -g) # echo "Hit a key " stty -icanon -echo # |
استفاده از فرمان echo برای برونداد یک متغیر غیر نقلقولی تنظیم شده با جایگزینی فرمان، کاراکترهای سطر جدید انتهایی را از خروجی فرمان(های) تخصیص یافته حذف میکند. این مطلب میتواند باعث غافلگیری ناخوشایندی بشود. dir_listing=`ls -l` echo $dir_listing # # # # # # echo "$dir_listing" # # # # # |
جایگزینی فرمان حتی تنظیم یک متغیر به محتوای یک فایل را با استفاده از تغییر مسیر یا فرمان cat جایز میکند.
variable1=`<file1` #تنظیم متغیر variable1 به محتویات فایل file1 variable2=`cat file2` #تنظیم متغیر variable2 به محتویات فایل file2 #به هرحال، این یک پردازش جدید منشعب میکند, #+ # #+ # echo "` <$0`" #
#برگزیده از فایل سیستمی /etc/rc.d/rc.sysinit (در یک سیستم لینوکس ردهت) if [ -f /fsckoptions ]; then fsckoptions=`cat /fsckoptions` ... fi # # if [ -e "/proc/ide/${disk[$device]}/media" ] ; then hdmedia=`cat /proc/ide/${disk[$device]}/media` ... fi # # if [ ! -n "`uname -r | grep -- "-"`" ]; then ktag="`cat /proc/version`" ... fi # # if [ $usb = "1" ]; then sleep 5 mouseoutput=`cat /proc/bus/usb/devices 2>/dev/null|grep -E "^I.*Cls=03.*Prot=02"` kbdoutput=`cat /proc/bus/usb/devices 2>/dev/null|grep -E "^I.*Cls=03.*Prot=01"` ... fi
جایگزینی فرمان تنظیم یک متغیر به خروجی یک حلقه را اجازه میدهد. کلید این کار در تصرف خروجی یک فرمان echo در داخل حلقه است.
مثال 12-2. تولید یک متغیر از یک حلقه
#!/bin/bash # variable1=`for i in 1 2 3 4 5 do echo -n "$i" #فرمان 'echo' در اینجا برای done` #+ echo "variable1 = $variable1" # i=0 variable2=`while [ "$i" -lt 10 ] do echo -n "$i" #دوباره، 'echo' ضروری. let "i += 1" # done` echo "variable2 = $variable2" # # exit 0
نوع $(...) جایگزینی فرمان، نقلقولهای برعکس برای جایگزینی فرمان را از اعتبار انداخته است.
output=$(sed -n /"$1"/p $file) # نوع $(...) جایگزینی فرمان، با backslash دوتایی به روشی غیر از `...` رفتار میکند.
bash$ echo `echo \\` bash$ echo $(echo \\) \ شکل $(...) جایگزینی فرمان، تودرتویی را اجازه میدهد. [3] word_count=$( wc -w $(echo * | awk '{print $8}') ) یا برای موردی تا اندازهای پیچیدهتر . . . #!/bin/bash # # # |
مثالهای جایگزینی فرمان در اسکریپتهای پوسته:
[1] | از منظر جایگزینی فرمان، یک فرمان میتواند یک فرمان خارجی سیستم، یک builtin داخلی اسکریپتنویسی، یا حتی یک تابع اسکریپت باشد. |
[2] | در یک مفهوم از نظر تکنیکی صحیحتر، جایگزینی فرمان stdout یک فرمان را استخراج کرده، سپس آن را با استفاده از عملگر = به یک متغیر تخصیص میدهد. |
[3] | در واقع، تودرتویی با نقلقولهای برعکس نیز ممکن است، اما همانطورکه John Default اشاره میکند، فقط با معاف کردن (escaping) نقلقولهای برعکس درونی. word_count=` wc -w \`echo * | awk '{print $8}'\` ` |