สวัสดี เราชื่อ tilde หรือที่ เรียกเราว่า ตัวหนอน EP.1

เครื่องหมาย ~ - tilde ใน BASH มีความหมายพิเศษบางอย่าง ที่มากกว่า Home Directory

author image
drs

Technology evangelistic advocacy

Posted on 2024-09-24 00:51:47 +0700

การเอ่ยถึง 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=d8kecho ~
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

Share on

Tags

Human knowledge belongs to the world

a line from the movie "Antitrust"