Bash shell มีตัวแปรบางตัวที่นำหน้าด้วย '~' (ชื่อ tilde) ซึ่งเรียกว่า Tilde Expansions
เป็นคำพ้องความหมายสำหรับเนื้อหาของตัวแปรอื่นๆ ภายในเชลล์ของคุณ
การขยายตัวหนอนเป็นกระบวนการแปลงตัวย่อเหล่านี้เป็นชื่อไดเร็กทอรีที่ย่อมาจาก ในบทความนี้ ให้เราตรวจสอบคุณลักษณะการขยายตัวหนอนด้วยตัวอย่าง
การขยายตัวหนอนใช้กับอักขระ '~' บวก รวมถึง +, – และ N (ซึ่งเป็นจำนวนเต็ม) จนถึงช่องว่างหรือเครื่องหมายทับ .
การขยายตัวหนอนใช้เพื่อขยายไปยังชื่อพาธเฉพาะหลายชื่อ:
- โฮมไดเร็กตอรี่
- ไดเรกทอรีการทำงานปัจจุบัน/ก่อนหน้า
- ไดเร็กทอรีจากไดเร็กทอรีสแต็ก
โฮมไดเร็กทอรี
การขยาย Tilde ให้วิธีการขยายโฮมไดเร็กทอรีของผู้ใช้ปัจจุบันหรือโฮมไดเร็กทอรีของชื่อผู้ใช้ที่กำหนด
Syntax ~ Expand to the variable $HOME or home directory of the current user ~USER Expand to the home directory of the given username
ตัวอย่าง 1. หน้าแรกของผู้ใช้ปัจจุบัน
Tilde(~) เป็นคำที่แยกจากกัน ขยายเป็น $HOME หากมีการกำหนดไว้ หากไม่ได้กำหนด $HOME ก็จะขยายด้วยโฮมไดเร็กทอรีของผู้ใช้ปัจจุบัน
ตอนนี้ค่าของตัวแปร HOME คือ /home/oracle ดังนั้น cd ~ เปลี่ยนไดเร็กทอรีปัจจุบันเป็นค่าของ $HOME
## Logging into a oracle user, whose home directory is /home/oracle # su oracle [tmp]$ pwd /tmp [tmp]$ echo $HOME /home/oracle [tmp]$ cd ~ [~]$ pwd /home/oracle
HOME ถูกเปลี่ยนเป็น /sbin และ cd ~ ใช้ $HOME เท่านั้น ไม่ใช่โฮมไดเร็กทอรีของผู้ใช้ หลังจากยกเลิกการตั้งค่า $HOME แล้ว cd ~ เปลี่ยนไดเร็กทอรีเป็นค่าของโฮมไดเร็กทอรีที่กำหนดไว้สำหรับผู้ใช้ oracle ใน /etc/passwd สำหรับการขยาย Tilde HOME จะแทนที่โฮมไดเร็กทอรีจริง
[~]$ export HOME=/sbin [oracle]$ cd ~ [~]$ pwd /sbin [~]$ unset HOME [sbin]$ cd ~ [oracle]$ pwd /home/oracle
ตัวอย่างที่ 2 โฮมไดเร็กทอรีของผู้ใช้ที่กำหนด
สคริปต์ต่อไปนี้ใช้การสำรองข้อมูลของล็อกไฟล์ที่มีวันที่ปัจจุบันในชื่อ นอกจากนี้ยังบันทึกเวลาเริ่มต้นและเวลาสิ้นสุดลงในไฟล์ชื่อ backup.log ในโฮมไดเร็กทอรีของผู้ใช้ oracle
#! /bin/bash echo "Initiating the backup at `date`" >> ~oracle/backup.log da=`date +%F` cp $da.log{,.bak} echo "END BACKUP at `date`" >> ~oracle/backup.log $ ls -l /home/oracle/ total 8 -rw-r--r-- 1 root root 99 Jun 4 14:23 backup.log
หากไม่มีชื่อผู้ใช้ที่ระบุ ชื่อผู้ใช้นั้นจะไม่ขยายไปยังบางสิ่ง ในตัวอย่างต่อไปนี้ ไม่มีผู้ใช้ชื่อ ora ดังนั้น ~ora จะไม่ขยายเป็น /home/ora
$ echo ~ora ~ora
อ้างถึงบทความก่อนหน้าของเราเพื่อทำความเข้าใจวิธีการขยายวงเล็บปีกกาในทุบตี เช่นวิธีการใช้ { } ในทุบตี
ไดเร็กทอรีการทำงาน
ตัวหนอนที่มี + และ – ใช้สำหรับแสดงไดเร็กทอรีการทำงาน
- ~+ ขยายเป็นค่าของตัวแปร PWD ซึ่งเก็บไดเร็กทอรีการทำงานปัจจุบันไว้
- ~- ขยายเป็นค่าของตัวแปร OLDPWD ซึ่งเก็บไดเร็กทอรีการทำงานก่อนหน้า หากไม่ได้ตั้งค่า OLDPWD ~- จะไม่ถูกขยาย
ตัวอย่างที่ 3 การขยายไดเรกทอรีการทำงานเก่า/ปัจจุบัน
ตัวอย่างต่อไปนี้จะเปรียบเทียบไฟล์ในไดเร็กทอรีปัจจุบันและไดเร็กทอรีการทำงานก่อนหน้า
$ cat comp.sh #! /bin/bash set -x cd /var/opt/gg if [ -f gg.c ] then echo "File1 exists" fi cd /var/opt1/gg if [ -f gg.c ] then echo "File2 exists" cmp ~+/gg.c ~-/gg.c fi $ ./comp.sh + cd /var/opt/gg + '[' -f gg.c ']' + echo 'File1 exists' File1 exists + cd /var/opt1/gg + '[' -f gg.c ']' + echo 'File2 exists' File2 exists + cmp /var/opt1/gg/gg.c /var/opt/gg/gg.c cmp: EOF on /var/opt1/gg/gg.c $
ในการดำเนินการข้างต้น:
- ~+/gg.c ขยายเป็น /var/opt1/gg/gg.c
- ~-/gg.c ขยายเป็น /var/opt/gg/gg.c
บทความนี้เป็นส่วนหนึ่งของชุดการสอน Bash ที่กำลังดำเนินอยู่
ส่วนขยายสำหรับไดเรกทอรีในสแต็ก
แต่ละกระบวนการทุบตีมีวัตถุสแต็กที่สามารถใช้เพื่อติดตามไดเรกทอรีที่สคริปต์เข้าชมในขณะที่กำลังประมวลผลข้อมูลของเนื้อหาไดเรกทอรี
เป็นกลไกที่ง่ายมากในการอ้างอิงไดเร็กทอรีหรือเปลี่ยนกลับไปเป็นไดเร็กทอรีที่เคยเยี่ยมชมมาก่อน การขยาย Tilde ยังให้การขยายไปยังไดเร็กทอรีในไดเร็กทอรีสแต็กอีกด้วย
- ~+N ขยายไดเร็กทอรี Nth ในไดเร็กทอรีสแต็ก (นับจากด้านซ้ายของรายการที่พิมพ์โดย dirs เมื่อเรียกใช้โดยไม่มีตัวเลือก) โดยเริ่มจากศูนย์
- ~-N ขยายไดเร็กทอรี Nth ในไดเร็กทอรีสแต็ก (นับจากด้านขวาของรายการที่พิมพ์โดย dirs เมื่อเรียกใช้โดยไม่มีตัวเลือก) โดยเริ่มจากศูนย์
อ่านบทความก่อนหน้าของเราเพื่อทำความเข้าใจวิธีใช้คำสั่ง dirs, pushd และ popd เพื่อจัดการกับไดเร็กทอรีสแต็ก
ตัวอย่างที่ 4 แสดงไดเร็กทอรี Nth จากด้านซ้ายโดยใช้ ~+
ในตัวอย่างต่อไปนี้ ไดเร็กทอรีสแต็กมี 4 ไดเร็กทอรี ~+2 ช่วยให้คุณมีเส้นทางไดเรกทอรีในตำแหน่งที่สองจากด้านซ้ายโดยเริ่มจากศูนย์
$ dirs -v 0 /sbin 1 /var/opt/midas 2 /var/opt/GG/bin 3 /root $ cd ~+2 $ pwd /var/opt/GG/bin
แต่ด้านบนของสแต็ก (ตำแหน่งศูนย์) จะมีไดเร็กทอรีปัจจุบันเสมอ ดังนั้นหลังจากดำเนินการข้างต้น การติดตามจะปรากฏในไดเร็กทอรีสแต็ก
$ dirs -v 0 /var/opt/GG/bin 1 /var/opt/midas 2 /var/opt/GG/bin 3 /root
ตัวอย่างที่ 5. แสดงไดเร็กทอรี Nth จากด้านขวาโดยใช้ ~-
ต่อไปนี้เป็นคล้ายกับตัวอย่างข้างต้น แต่จะพิจารณาไดเร็กทอรีจากด้านล่างสุดของสแต็กเนื่องจาก ~-.
$ dirs -v 0 /var/opt/GG/bin 1 /var/opt/midas 2 /var/opt/GG/bin 3 /root $ cd ~-2 $ pwd /var/opt/midas $ dirs -v 0 /var/opt/midas 1 /var/opt/midas 2 /var/opt/GG/bin 3 /root