ทำไมเราใช้./filename
เพื่อรันไฟล์ใน linux
ทำไมไม่เพียงแค่ใส่มันเหมือนคำสั่งอื่น ๆgcc
, ls
ฯลฯ ...
ทำไมเราใช้./filename
เพื่อรันไฟล์ใน linux
ทำไมไม่เพียงแค่ใส่มันเหมือนคำสั่งอื่น ๆgcc
, ls
ฯลฯ ...
คำตอบ:
ใน Linux, UNIX และระบบปฏิบัติการที่เกี่ยวข้อง.
แสดงถึงไดเรกทอรีปัจจุบัน เนื่องจากคุณต้องการเรียกใช้ไฟล์ในไดเรกทอรีปัจจุบันของคุณและไดเรกทอรีนั้นไม่ได้อยู่ในคุณ$PATH
คุณจำเป็นต้องมี./
บิตเพื่อบอกเชลล์ว่าไฟล์ปฏิบัติการอยู่ที่ไหน ดังนั้น./foo
หมายถึงเรียกใช้ปฏิบัติการที่เรียกว่าfoo
ที่อยู่ในไดเรกทอรีนี้
คุณสามารถใช้type
หรือwhich
เพื่อให้ได้เส้นทางที่เต็มรูปแบบของคำสั่งใด ๆ $PATH
ที่พบในของคุณ
alias
ES $PATH
ที่สามารถได้รับในทางที่ไม่เพียง
.
ก่อนมันจะเป็นปัญหาด้านความปลอดภัยคุณหรือคนอื่นสามารถแทนที่ได้ls
(ไวรัส / โทรจันแบบง่าย: สร้างไฟล์ zip โดยมีชื่อไฟล์เรียกทำงานls
ในขณะที่บางคนกำลังค้นหาผ่าน พวกเขาเรียกใช้ไฟล์ปฏิบัติการนี้ว่า…) หากค้นหา.
ครั้งสุดท้ายคุณสามารถใช้เวลานานมากที่จะไม่รู้ว่าทำไมโปรแกรมของคุณถึงไม่ทำงาน (เช่นคุณสร้างโปรแกรมที่เรียกว่าการทดสอบแทนการรันโปรแกรมของคุณมันจะรันโปรแกรมทดสอบระบบซึ่งไม่สร้างผลลัพธ์)
export PATH="$PATH:."
เพื่อรันคำสั่งในไดเรกทอรีปัจจุบันหากไม่พบที่อื่นใน PATH คุณสามารถเพิ่มสิ่งนี้ในไฟล์. bashrc ของคุณ
$PATH
คำตอบที่แท้จริงคือเป็นคนอื่นได้รับเพราะไดเรกทอรีปัจจุบันไม่ได้อยู่ในของคุณ
แต่ทำไม กล่าวโดยย่อก็เพื่อความปลอดภัย หากคุณกำลังมองหาโฮมไดเร็กตอรี่ของบุคคลอื่น (หรือ / tmp), และพิมพ์เพียงแค่, gcc
หรือls
คุณต้องการรู้ว่าคุณกำลังใช้งานจริง, ไม่ใช่เวอร์ชันที่เป็นอันตรายที่เพื่อนนักเล่นพิเรนสเตอร์ของคุณเขียนซึ่งจะลบไฟล์ทั้งหมดของคุณ อีกตัวอย่างหนึ่งคือtest
หรือ[
ซึ่งอาจแทนที่คำสั่งเหล่านั้นในเชลล์สคริปต์หากเชลล์ของคุณไม่มีคำสั่งเหล่านั้นในตัว
มี.
เป็นครั้งสุดท้ายรายการในเส้นทางของคุณเป็นบิตที่ปลอดภัย แต่มีการโจมตีอื่น ๆ ซึ่งทำให้การใช้งานที่ หนึ่งที่ง่ายคือการใช้ประโยชน์จากความผิดพลาดที่พบบ่อยเช่นหรือsl
ls-l
หรือค้นหาคำสั่งทั่วไปที่ไม่ได้ติดตั้งบนระบบนี้ - vim
ตัวอย่างเช่นเนื่องจาก sysadmins มีแนวโน้มสูงกว่าค่าเฉลี่ยที่จะพิมพ์
PATH
ตัวแปรสภาพแวดล้อม
หากคุณหมายความว่าทำไมคุณต้องใช้. / ตอนเริ่มต้น - นั่นเป็นเพราะ (ต่างจากใน Windows) ไดเรกทอรีปัจจุบันไม่ได้เป็นส่วนหนึ่งของเส้นทางของคุณโดยค่าเริ่มต้น หากคุณทำงาน:
$ ls
เชลล์ของคุณค้นหาls
ในไดเรกทอรีในตัวแปรสภาพแวดล้อม PATH ของคุณ ( echo $PATH
เพื่อดูมัน) และเรียกใช้ไฟล์ปฏิบัติการตัวแรกที่เรียกls
ว่าพบ หากคุณพิมพ์:
$ a.out
เชลล์จะทำเช่นเดียวกัน - แต่มันอาจจะไม่พบไฟล์ปฏิบัติการที่เรียกว่า a.out คุณจำเป็นต้องบอกเปลือกที่ a.out คือ - ./a.out
มันก็อยู่ในไดเรกทอรีปัจจุบันแล้วเส้นทาง
หากคุณถามว่าเพราะเหตุใดจึงเรียกว่า "a.out" นั่นเป็นเพียงชื่อไฟล์เอาต์พุตเริ่มต้นสำหรับ gcc คุณสามารถเปลี่ยนได้ด้วย -o บรรทัดคำสั่งหาเรื่อง ตัวอย่างเช่น:
$ gcc test.c -o test
$ ./test
touch .a.out; ls -lA
ดูนี่สิ)
<dir>/<file>
เพื่อให้คุณมีพื้นบอกว่ารันไฟล์ในไดเรกทอรีปัจจุบันซึ่งจะแสดงโดย./test
คุณสามารถลองเพิ่ม:.
ตัวแปร $ PATH ของคุณ
ลอง ALT + F2 และพิมพ์: gksudo gedit /etc/environment
ถ้าใช้ Linux / GTK (นี่คือสิ่งที่คุณมีหากใช้ Ubuntu)
อย่างไรก็ตามฉันขอแนะนำให้คุณอย่าทำเช่นนั้น มันเลวร้ายเลวร้ายเลวร้าย
คุณรู้ไหมว่ามันทำงานแบบนี้มาตั้งแต่ปี 1970 มีเหตุผลว่าทำไมไดเรกทอรีปัจจุบันไม่รวมอยู่ใน $ PATH
.
เป็นไดเรกทอรีปัจจุบัน
.something
จะเป็นไฟล์ที่ซ่อนอยู่ (พิมพ์ "ALT +" เพื่อให้ปรากฏใน Nautilus หรือลอง " ls -la
"
./someProgram.sh
คือสิ่งที่คุณพิมพ์เพื่อเรียกใช้ someProgram.sh ที่รันได้ในไดเร็กทอรีปัจจุบัน
.somethingElse
จะหมายความว่าคุณมีไฟล์ปฏิบัติการที่ซ่อนอยู่ในไดเรกทอรีปัจจุบันซึ่งเป็นแนวคิดที่ไม่ดี
./command_name
เพื่อรันคำสั่งใน linux?"