ทำไมเราใช้./filenameเพื่อรันไฟล์ใน linux
ทำไมไม่เพียงแค่ใส่มันเหมือนคำสั่งอื่น ๆgcc, lsฯลฯ ...
ทำไมเราใช้./filenameเพื่อรันไฟล์ใน linux
ทำไมไม่เพียงแค่ใส่มันเหมือนคำสั่งอื่น ๆgcc, lsฯลฯ ...
คำตอบ:
ใน Linux, UNIX และระบบปฏิบัติการที่เกี่ยวข้อง.แสดงถึงไดเรกทอรีปัจจุบัน เนื่องจากคุณต้องการเรียกใช้ไฟล์ในไดเรกทอรีปัจจุบันของคุณและไดเรกทอรีนั้นไม่ได้อยู่ในคุณ$PATHคุณจำเป็นต้องมี./บิตเพื่อบอกเชลล์ว่าไฟล์ปฏิบัติการอยู่ที่ไหน ดังนั้น./fooหมายถึงเรียกใช้ปฏิบัติการที่เรียกว่าfooที่อยู่ในไดเรกทอรีนี้
คุณสามารถใช้typeหรือwhichเพื่อให้ได้เส้นทางที่เต็มรูปแบบของคำสั่งใด ๆ $PATHที่พบในของคุณ
aliasES $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?"