วันพฤหัสบดีที่ 20 มีนาคม พ.ศ. 2557

การ execute ไฟล์ ในระบบ linux

โดยส่วนตัวแล้วเป็นคนที่เล่น Linux ไม่ค่อยชำนาญมากนัก บางครั้งเราก็ทำตาม Tutorial ในเน็ตโดยไม่ได้รู้เลยว่า เข้าเข้าถึงไฟล์ ต่างๆ มันเป็นยังไง เช่น ทำไมเราต้อง

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 สามารถทำงานได้

ต่อไปไฟล์ 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 นั่นเอง




ไม่มีความคิดเห็น:

แสดงความคิดเห็น