การเอ่ยถึง Shell ในหัวข้อนี้ จะหมายถึง BASH - Bourne Again SHell
แนะนำตัวหนอนน้อย
เครื่องหมาย ~ ที่เราเห็นอยู่ใน keyboard มุมซ้าย แถวบนสุด ข้างเลข 1 เรามักจะเรียกว่า ตัวหนอน มีชื่อในภาษาอังกฤษว่า Tilde อ่านออกเสียงประมาณนี้ /ˈtildə/ ซึ่งโดยปกติในชีวิตประจำวัน เรามักไม่ค่อยเห็น และใช้งานเท่าไหรหนัก โดยเฉพาะในภาษาไทย แต่สำหรับคนที่ใช้งาน UNIX หรือ Linux อาจจะพอเห็นผ่านตามาบ้าง
ตัวหนอนในฐานะ Home Directory
เวลาที่เราใช้งาน Shell เรามักจะใช้งานตัวหนอนแทน Home Directory ของผู้ใช้งาน เช่นเวลาที่เราต้องการเข้าถึงไฟล์ที่เป็น Default SSH Public Key เราอาจจะอ้างถึงในรูปแบบนี้ ตามตัวอย่าง
❯ cat ~/.ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDFwOwM+G8OFJoRJKvdrBeVXjwgnlvHNdcaswF9iaFMHvJCIJp8OxFrZuMEgacrBP6mI/BSqfR8+2V3kE/3IBBi5P3rpog4e6Mz1jefvBRQqyhguUJmi+tMV38UteLscY9WICtsJiZFs14SJm0j93GSMyBpHVQKnuwOg0B6tMGBeePunRvdfFeKeJB661Z+uDOH26LNnMkhATiDoEK3n/5R/jwak2kXZDiVf5FOcC3dFCV0eZUJRKliKnKg6FKJCA8ABMuI4cC8o638JsROuOuJ0+Qm3s/saKhvfMJnUDqspUnX2Qcf2KDTf9CPEp9XllHtfQrU9Ev+CuWuAFBqe741MIDT+jcvmdw5ekQVh6VGc5sxe8GDzbGxHTfYRXxITepUIByQaNEXI5vAeJpcd810MXQtl3QsmQJ27fg78QKccNYmql9KzFU/TV4ALIbtr6dRmtRbBi/mkYu1muzpOh0WPqPs1ltnSKhhklLDc+a8tS12/ogncOJxCGvr19g/H2s= drs@server.d8k.dev
จากตัวอย่าง ก็จะเห็นว่า คำสั่ง cat ก็จะไปอ่านไฟล์ที่ HOME Directory ซึ่งในกรณีนี้ก็จะเป็น login name ชื่อว่า drs และจะไปผ่านไฟล์ /home/drs/.ssh/id_rsa.pub ออกมาแสดงผลผ่านทาง Standard Ouput
tilde กับความเข้าใจผิดเรื่อง HOME Directory
ความรู้เรื่อง tilde ที่เราเคยมี และถูกสอนต่อ ๆ กันมาคือ การใช้เครื่องหมาย tilde ใน Shell เป็นตัวแทนของ Home Directory ของ user ที่เรากำลัง login เพื่อใช้งานอยู่ .... ความจริงไม่ได้เป็นอย่างนั้น tilde ไม่ได้ถูกแทนที่ด้วย Home Directory แต่ tilde จะถูกแทนด้วยตัวแปร HOME
หลายท่านอ่านมาถึงบรรทัดนี้ ก็อาจจะแย้งว่า มันก็คือค่าเดียวกันนินา ... ใช่ครับ ในสถานการณ์ปกติ มันคือค่าเดียวกัน แต่ที่ผมอยากสื่อว่ามันต่างกันคือ ในกรณีที่ ถ้ามีการไปแก้ตัวแปร HOME ค่าที่ได้จะเปลี่ยนไปก็ได้ ไม่ตรงกันแล้ว Home Directory ที่ระบุใน /etc/passwd
ตัวอย่างในสถานการณ์ปกติ
❯ echo ~ /home/drs ❯ echo ~/mydata /home/drs/mydata
ลองดูสถานการณ์ที่ตัวแปร HOME ถูกแก้ไข เพื่อพิสูจน์กันว่า tilde จะถูกแทนที่ด้วยตัวแปร HOME
#-- นิยามตัวแปร HOME ให้มีค่าเป็น d8k ❯ HOME=d8k ❯ echo ~ d8k ❯ echo ~/mydata d8k/mydata
ความเป็นจริงที่เกิดขึ้นกับตัวหนอน
ขณะที่เราพิมพ์เครื่องหมาย tilde (~) บน terminal แล้วส่งไปให้ Shell ต่อจากนั้น Shell จะเข้าสู่ขั้นตอนของการดำเนินงาน (Shell Operation) รายละเอียดในการทำ Shell Operation หนึ่งในกระบวนการที่จะเกิดขึ้นเรียกว่า Shell Expansion และ หนึ่งในขั้นการของการทำ Shell Expansion ก็คือ Tilde Expansion นั่นก็คือขั้นตอนที่จะแปลความหมายของ tilde และข้อความที่เกี่ยวข้องกับ tilde
เริ่มจาก มาดูเงื่อนไข และชื่อเรียกที่เกี่ยวข้องกับ Tilde Expansion
- เครื่องหมาย tilde จะต้องไม่ได้ถูกคร่อมด้วย quote คือ การใช้ tilde จะต้องเป็นหน้ามาแบบนี้ mkdir -p ~/data/finance แต่ถ้าเป็นแบบนี้ mkdir -p "~/data/finance" ก็จะไม่เข้าเงื่อนไขที่จะทำ Tilde Expansion
- ข้อความที่อยู่หลังเครื่องหมาย tilde จนถึง เครื่องหมาย / หรือ white space จะเรียกกว่า tilde-prefix เช่น
- ~tilde-prefix
- ~tilde-prefix/
- ~tilde-prefix/data
รายละเอียด เรื่อง tilde-prefix เจอกัน EP.2 ครับ
end of document