หน้าแรก Applications เรื่องน่ารู้ : การใช้คำสั่ง “set” บนลีนุกซ์

เรื่องน่ารู้ : การใช้คำสั่ง “set” บนลีนุกซ์

แบ่งปัน

คำสั่ง set บนลีนุกซ์ใช้สำหรับเปลี่ยนค่าออพชั่นของเชลล์ หรือใช้แสดงชื่อและค่าของตัวแปรในเชลล์ได้ แม้จะเป็นคำสั่งที่มีมาแต่แรกของ Bash ที่ไม่ค่อยได้ใช้งานแพร่หลาย แต่ก็ถือเป็นคำสั่งที่ซับซ้อนกว่าคำสั่งบิวท์อินอื่นๆ

ซึ่งถ้าคุณเผลอใช้คำสั่งนี้โดยไม่ได้กำกับอาร์กิวเมนต์ใดๆ จะกลายเป็นการแสดงรายการการตั้งค่าทั้งหมด ที่ประกอบด้วยชื่อและค่าของตัวแปรรวมทั้งฟังก์ชั่นทั้งหมดของเชลล์ จึงต้องระวังไว้ให้ดี! ไม่งั้นคุณอาจเจอกับข้อมูลเอาต์พุตปริมาณมหาศาลไหลท่วมหน้าจอแบบไม่หยุดหย่อนได้ อย่างระบบของ Fedora เองก็ให้เอาต์พุตของคำสั่งนี้มากถึงประมาณ 3,000 บรรทัด โดยดูได้จากคำสั่งนี้:

$ set | wc -l
2954

สำหรับส่วนแรกของรายการการตั้งค่าที่ได้จากคำสั่ง set จะมีลักษณะคล้ายตัวอย่างด้านล่าง สังเกตได้ว่าเอาต์พุตจะค่อนข้างซับซ้อนชึ้นเรื่อยๆ เมื่อเลื่อนลงมา

$ set | head -10
BASH=/bin/bash
BASHOPTS=cdspell:checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:globasciiranges:histappend:interactive_comments:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=([0]=”0″)
BASH_ARGV=()
BASH_CMDS=()
BASH_COMPLETION_VERSINFO=([0]=”2″ [1]=”11″)
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]=”5″ [1]=”1″ [2]=”0″ [3]=”1″ [4]=”release” [5]=”x86_64-redhat-linux-gnu”)

ดังนั้น เรามาดูถึงประโยชน์ที่ใช้ได้จริงของคำสั่ง set กันดีกว่า ซึ่งมีตัวอย่างการใช้ที่น่าสนใจดังต่อไปนี้

ใช้แก้ไขบั๊กในสคริปต์ของคุณ
คุณสามารถใช้คำสั่ง set -x เพื่อดีบั๊กสคริปต์บางอย่างได้ หรือกล่าวอีกนัยหนึ่งคือ เมื่อคุณใช้ออพชั่นนี้ Bash จะแสดงเอาต์พุตที่ละเอียดขึ้นเกี่ยวกับการทำงานของสคริปต์ อย่างสคริปต์ในตัวอย่างนี้มีการตรวจสอบอยู่หลายขั้นตอนก่อนจะพิมพ์ข้อมูลบรรทัดบนๆ ของไฟล์ที่เลือกออกมาให้

#!/bin/bash
set -x

if [ $# -lt 2 ]; then
echo “Usage: $0 lines filename”
exit 1
fi
if [ ! -f $2 ]; then
echo “Error: File $2 not found”
exit 3
else
echo top of file
head -$1 $2
fi

msg=”bye”
echo $msg

ถ้าเราไม่ได้ใช้ set -x สคริปต์ข้างต้นจะแสดงผลออกมาแค่นี้:

$ script3 3 file
top of file
#!/bin/bash -x

date
bye

แต่ถ้าใช้ set -x ก็จะแสดงแต่ละคำสั่งขณะที่มีการรันร่วมกับเอาต์พุตออกมาด้วย

$ script3 3 file
+ ‘[‘ 2 -lt 2 ‘]’
+ [[ 3 != [0-9]* ]]
+ ‘[‘ ‘!’ -f file ‘]’
+ echo top of file
top of file
+ head -3 file
#!/bin/bash -x

date
+ msg=bye
+ echo bye
Bye

นอกจากนี้ คุณยังสามารถเปิดโหมดดีบั๊กได้ด้วยการใส่ออพชั่น -x บนบรรทัดที่ใช้ #! หรือที่เรียกว่า “Shebang Line” (เช่น บรรทัดบนสุดของสคริปต์) แบบนี้ได้ด้วย:

#!/bin/bash -x

ยังมีทริคอย่างการใช้คำสั่ง set -x แล้วปิดส่วนที่ต้องการด้วย set +x เพื่อจำกัดส่วนในการดีบั๊กที่เริ่มจากบรรทัด set แรกลงมาจนถึงบรรทัดที่ปิด set อันถัดมา เพื่อให้แสดงเอาต์พุตละเอียดเฉพาะส่วนหนึ่งของสคริปต์ที่ต้องการตรวจดูเป็นพิเศษเท่านั้น ตัวอย่างเช่น

set -x
if [ ! -f $2 ]; then
echo “Error: File $2 not found”
exit 3
else
echo top of file
head -$1 $2
fi
set +x

ซึ่งออพชั่นอื่นของคำสั่ง set ก็สามารถสั่งเปิดและปิดอีกครั้งได้ด้วยวิธีที่คล้ายกันนี้

ใช้ส่งออกค่าอัตโนมัติ
ด้วยคำสั่ง set -a ทำให้สามารถส่งออกค่าของตัวแปรหรือฟังก์ชั่นใดๆ ที่คุณสร้างออกมาอัตโนมัติ เพื่อให้ซับเชลล์และสคริปต์ต่างๆ นำไปใช้ได้ ยกตัวอย่างเช่น:

$ set -a
$ one=1
$ two=2
$ three=3
$ four=4
$ /bin/bash <== start new shell
$ echo $one $two $three $four
1 2 3 4

ใช้บังคับออกจากสคริปต์ทันทีถ้าคำสั่งล้มเหลว
ด้วยคำสั่ง set -e จะทำให้สคริปต์ออกจากการทำงานทันทีถ้าพบการทำงานผิดพลาด อย่างตัวอย่างนี้ที่ใช้คำสั่ง set -e

$ cat script1
#!/bin/bash

set -e
cat nosuchfile
echo “So long!”

เมื่อไม่มีไฟล์ที่ชื่อว่า “nosuchfile” ทำให้สคริปต์ออกจากการทำงานที่จุดดังกล่าวได้ด้วยความช่วยเหลือของคำสั่ง set -e ทำให้คำสั่งต่อมาอย่าง echo ไม่มีโอกาสได้รันต่อ

$ script1
cat: nosuchfile: No such file or directory

ใช้ฟ้องกรณีไม่พบค่าตัวแปรที่เรียกใช้
ปกติแล้วโดยดีฟอลต์ Bash จะมองข้ามตัวแปรที่ไม่มีตัวตน ตัวอย่างเช่นสคริปต์ด้านล่างนี้ Bash จะมองข้ามข้อเท็จจริงที่ว่าไม่เคยมีการนิยามค่า $var2 มาก่อน โดยแสดงผลเฉพาะค่าของ $var1

$ cat script1
#!/bin/bash
var1=”123″
echo $var1 $var2
$ ./script1
123

แต่ถ้าคุณใส่คำสั่ง set -u ลงในสคริปต์ไปด้วย ก็จะบังคับให้รายงานปัญหาตัวแปรขึ้นมาแทน ดังนี้

$ cat script2
#!/bin/bash

set -u
var1=”123″
echo $var1 $var2

$ ./script2
./script1: line 5: var2: unbound variable

มาถึงตรงนี้จะเห็นได้ว่าคำสั่ง set มีหลายออพชั่นมากให้ลองใช้งาน แต่ก็จะมีบางออพชั่นที่โดดเด่นเป็นประโยชน์อย่างชัดเจนอย่างเช่นกรณีข้างต้นเหล่านี้

ที่มา : Networkworld