maykungth@maykungth-debain:~$ ./a.out
ในบทความนี้ จะอธิบายเล็กๆ น้อยๆ ตามความเข้าใจส่วนตัวนะครับ
ผมได้ทำการทดลอง โดยผมมีไฟล์อยู่สามไฟล์นะครับ คือ
- a.out (Binary จากการ Complie ด้วย gcc เขียนด้วยภาษา C สั่งให้ printf Hello World)
- shell.sh (Shell script ธรรมดาๆ สั่งให้ echo Hello World)
- activate (Shell script ที่เกิดจากคำสั่ง venv ของ python เป็นการกำหนด Path เพื่อเตรียมสภาพแวดล้อมของ Virtual Environment ที่สร้างขึ้น)
ที่อยู่ของแต่ละไฟล์
สมมุติว่าให้ไฟล์ที่อยู่ /home/maykungth หมดทุกไฟล์นะครับ
สิ่งที่เราสงสัยคือ หากเราจะสั่งให้ไฟล์ๆนึง ทำงาน เราจะต้องใช้อะไร . หรือ ./ หรือ source หรืออะไร เรามาทดลองกันเลยดีกว่า (. และคำสั่ง source คืออันเดียวกันนะ)
Current Directory อยู่ที่ /home/maykungth ซึ่งก็คืออยู่ที่เดียวกับไฟล์เหล่านั้นนะครับ
สำหรับไฟล์ a.out
~$ ./a.out หรือ $/home/maykungth/a.out สามารถทำงานได้
~$ . a.out หรือ $source a.out ไม่สามารถทำงานได้ มันฟ้องว่า ไม่สามารถ exe binary ได้
ต่อไปไฟล์ shell.sh
~$ ./shell.sh หรือ $/home/maykungth/shell.sh สามารถทำงานได้
~$ . shell.sh หรือ $source shell.sh สามารถทำงานได้
~$ ./a.out หรือ $/home/maykungth/a.out สามารถทำงานได้
~$ . a.out หรือ $source a.out ไม่สามารถทำงานได้ มันฟ้องว่า ไม่สามารถ exe binary ได้
ต่อไปไฟล์ shell.sh
~$ ./shell.sh หรือ $/home/maykungth/shell.sh สามารถทำงานได้
~$ . shell.sh หรือ $source shell.sh สามารถทำงานได้
ต่อไปไฟล์ activate
~$ ./activate หรือ $/home/maykungth/activate ไม่ฟ้อง Error แต่ไฟล์ activate ไม่ทำงาน
~$ . activate หรีือ source activate ก็ทำงานได้ตามปรกติ
สรุป...
ตามความเข้าใจของผม เราสามารถเข้าถึง executable file ได้โดยตรง ไม่ว่าจะเป็น binary หรือ script ให้มันจะทำงานได้เลย เ้ช่นการใช้ ./ ก็คือการเรียกใช้ executable file ใน current directory หรือเราจะเรียกตรงๆผ่านทาง path ที่อยู่มัน
ส่วนการใช้ . หรือ source มันคือการ sourcing หรือพูดง่ายๆคือการจัดเตรียมสภาพแวดล้อม กำหนดค่าตัวแปรต่างๆ คล้ายๆกับการ include นั้่นเอง พอเป็นแบบนี้แล้ว มันจึงไม่สามารถเรียก executable ที่เป็น binary ได้ แต่สามารถเรียกที่เป็น script ให้ทำงาน (แต่ผิดวัตถุประสงค์ไปหน่อย) ถ้าจะให้ถูกวัตถุประสงค์ ก็ควรเรียกไฟล์ activate เพราะข้างในไฟล์เป็นการกำหนดค่าตัวแปรต่างๆไว้
ส่วนสาเหตุที่เราไม่สามารถเรียก ~$ a.out หรือ ~$ shell.sh ได้โดยตรง เพราะว่าการเรียกแบบนี้ มันจะไปหาไฟล์ตาม PATH ที่เราได้ตั้งค่าไว้ก่อนหน้าแล้ว ซึ่งโดยปรกติ Current Directory ของเรามันก็ไม่ตรงกับ PATH ที่ตั้งค่าไว้ ยกเว้นคุณจะเรียกในพวกไฟล์ใน java ซึ่งได้ถูกเพิ่ม PATH ไว้แล้วในกรณีเครื่องติดตั้ง java ไว้ โดย PATH ที่เพิ่มไว้แล้วคือ java/bin นั่นเอง
ไม่มีความคิดเห็น:
แสดงความคิดเห็น