./ (dot slash) เป็นคำสั่งหรือไม่


16

หลักของคำถาม:

คำถามที่เกิดขึ้นในขณะที่ฉันไม่สามารถติดตั้งซอฟต์แวร์ดังนั้นฉันถามอย่างแท้จริงเกี่ยวกับ. / เพราะฉันไม่ทราบเกี่ยวกับมันและการส่งออก "ไม่พบคำสั่ง" ทำให้ฉันสับสนเกี่ยวกับสิ่งที่คำสั่งจริง

บริบท:

truecrypt-7.2-setup-x86ผมอยากจะติดตั้งไฟล์

คำแนะนำในการใช้คำสั่ง:

sudo ./truecrypt-7.2-setup-x86

แต่ผลลัพธ์คือ:

sudo: ./truecrypt-7.2-setup-x86: command not found

UPDATE: เพื่อความสมบูรณ์ในการทดสอบฉันอยู่ในโฟลเดอร์ไฟล์ แต่ยังไม่ได้ทำให้ไฟล์เรียกทำงานได้ (chmod + x)


1
./ส่วนหนึ่งของคำสั่งจะถูกบอกว่า "ดูในไดเรกทอรีปัจจุบันและรันคำสั่ง 'truecrypt-7.2 การติดตั้ง 86' จากที่นี่" คุณต้องเรียกใช้คำสั่งนี้จากไดเรกทอรีที่คุณแตกไฟล์
ชาร์ลส์กรีน

2
@Videonauth - ไม่ได้จริงๆโดยส่วนตัวฉันไม่คิดว่ามันจะยกระดับของคำตอบ
ชาร์ลส์กรีน

1
@ Zanna ฉันทดสอบสคริปต์โดยไม่มีสิทธิ์ดำเนินการและข้อผิดพลาดที่เกิดขึ้นเป็นข้อผิดพลาดการอนุญาตที่ขาดหายไปไม่พบคำสั่ง
ชาร์ลส์กรีน

2
@ubuntubu ตกลงดีมากคุณย้ายไปอยู่ในสารบบแล้ว - ดี ความคิดเห็นเล็ก ๆ เกี่ยวกับการแก้ไขแม้ว่า คำสั่งควรเป็นchmod +xสิ่งchmod -xที่ตรงกันข้าม - จะลบสิทธิ์การใช้งาน
Sergiy Kolodyazhnyy

4
ชื่อคำถามนั้นค่อนข้างแตกต่างจากร่างกาย อาจจะได้รับการแก้ไข?
David Z

คำตอบ:


24

./ไม่ใช่คำสั่ง ./truecrypt-7.2-setup-x86คำสั่งคือ

เชลล์และโปรแกรมเช่นsudoนั้นจะถือว่าคำสั่งเป็นชื่อพา ธเมื่อมันมี/อักขระอย่างน้อยหนึ่งตัว เนื่องจาก.แสดงถึงไดเรกทอรีใด ๆ ที่คุณอยู่ในปัจจุบัน./truecrypt-7.2-setup-x86ตั้งชื่อไฟล์truecrypt-7.2-setup-x86ในไดเรกทอรีปัจจุบัน หากไม่มีไฟล์ดังกล่าวหรือมี แต่ไม่สามารถเรียกใช้ไฟล์ได้คุณจะได้รับข้อความแสดงข้อผิดพลาด

เมื่อคำสั่งไม่ได้มีเฉือนไดเรกทอรีที่ระบุไว้ใน$PATHที่จะค้นหามันเป็นSergiy Kolodyazhnyy กล่าวว่า ไดเรกทอรีปัจจุบันไม่ได้โดยอัตโนมัติสืบค้น - และมันจะไม่แนะนำให้ใส่ใน. $PATHด้วยวิธีนี้คุณไม่ได้ตั้งใจทำงานในสิ่งที่คุณไม่คาดว่าจะทำงานเพราะคุณมีcdไดเรกทอรีที่บรรจุสิ่งเหล่านั้น

การเขียน./ก่อนชื่อของไฟล์เรียกทำงานในไดเรกทอรีปัจจุบันเป็นวิธีทั่วไปในการรัน แต่นี่ไม่ใช่ไวยากรณ์พิเศษจริง ๆ ตัวอย่างเช่นถ้าคุณ messed up ของคุณ$PATHและคุณจำเป็นต้องเรียกใช้คำสั่งเช่นคุณสามารถเขียนls /bin/lsไม่.จำเป็นในกรณีนั้นหรือโดยทั่วไป สิ่งที่จำเป็นคือที่/ใดที่หนึ่งในชื่อพา ธ เพื่อแสดงว่าคุณหมายถึงชื่อพา ธ

เนื่องจาก.เป็นไดเรกทอรีปัจจุบันเสมอและ/เป็นเพียงตัวคั่นไดเรกทอรีสิ่งแรกที่ต้องทำคือตรวจสอบว่าไฟล์ที่คุณตั้งชื่อมีอยู่จริงในไดเรกทอรีปัจจุบัน (ถ้าเป็นเช่นนั้นให้ตรวจสอบการอนุญาตตามที่Charles Green อธิบายแต่ถ้าคุณแตกไฟล์จากไฟล์เก็บถาวรมันมักจะมีสิทธิ์อนุญาตให้ใช้งานได้หากไฟล์นั้นตั้งใจให้ทำงาน)


21

ส่วน. / ของคำสั่งกำลังพูดว่า "ดูในไดเรกทอรีปัจจุบันและดำเนินการคำสั่ง 'truecrypt-7.2-setup-x86' จากที่นี่" คุณต้องเรียกใช้คำสั่งนี้จากไดเรกทอรีที่คุณแตกไฟล์

สามารถทดสอบได้: ในหน้าต่างเทอร์มินัลเดียวกับที่คุณพยายามใช้คำสั่งให้ป้อนคำสั่งls -l true*- หากไฟล์นั้นมีอยู่ในไดเรกทอรีการทำงานปัจจุบันจากนั้นรายการที่แสดงไฟล์ (และกลุ่มข้อมูลเพิ่มเติม) จะปรากฏขึ้น

Zanna ดังที่บันทึกไว้ในความคิดเห็นไฟล์ของคุณอาจไม่มีสิทธิ์ดำเนินการ - ซึ่งสามารถแก้ไขได้ง่าย เป็นกรณีทดสอบไดเรกทอรีของฉันแสดง

chick@dad:~/test$ ls -l
total 4
-rw-r--r-- 1 chick chick 788 Oct 27 06:15 rFullBack
chick@dad:~/test$

และไฟล์ "rFullBack" จะแสดงรายการ '-rw-' เป็นสิทธิ์ของฉันในการอ่านและเขียนไฟล์ ฉันสามารถดำเนินการคำสั่งchmod +x rFullBackและการเปลี่ยนแปลงรายชื่อไดเรกทอรีเป็น

chick@dad:~/test$ ls -l
total 4
-rwxr-xr-x 1 chick chick 788 Oct 27 06:15 rFullBack
chick@dad:~/test$

มีสิทธิ์ของฉันตอนนี้ '-rwx' แสดงว่าฉันสามารถรันไฟล์


กล่าวโดยย่อหากไฟล์นั้นมีอยู่ในไดเรกทอรีของคุณ

เรียกใช้คำสั่ง

chmod +x ./truecrypt-7.2-setup-x86

จากนั้นคำสั่ง

sudo ./truecrypt-7.2-setup-x86

1
ไม่มาก โดยจะแสดงรายการrw-เป็นสิทธิ์ของคุณ - -ก่อนหน้านี้ใช้สำหรับตั้งค่า [gu] id และเหนียวบิต
Duncan X Simpson

@DuncanXSimpson ขอบคุณ - ฉันได้อัปเดตคำอธิบายของการอนุญาตเล็กน้อย แต่ฉันจะไม่สนใจบิต setguid และเหนียวสำหรับคำตอบนี้!
ชาร์ลส์กรีน

8

การเรียกคำสั่งในเชลล์ทำงานอย่างไร

ไม่มันไม่ใช่คำสั่ง วิธีการทำงานของเชลล์คือเมื่อคุณพิมพ์ในบรรทัดข้อความคำแรกจะถูกใช้เป็นคำสั่งและหากคำสั่งไม่ใช่หนึ่งในตัวของเชลล์แล้วเชลล์จะดูตำแหน่งทั้งหมดที่อยู่ในรายการPATH ตัวแปรสภาพแวดล้อม .

จะเกิดอะไรขึ้นหากเมื่อคำสั่งที่คุณต้องการเรียกใช้อยู่ในไดเรกทอรีเดียวกับที่คุณอยู่ในขณะนี้ แต่ไดเรกทอรีนั้นไม่อยู่ในรายการPATHไดเรกทอรี ./นั่นคือเมื่อคุณจำเป็นต้องใช้ มันเป็นแบบเดียวกับที่ทำ/bin/bash- คุณกำลังบอกเชลล์ว่าคำสั่งที่คุณต้องการอยู่นั้นเป็นเส้นทางแบบเต็ม และในกรณีที่. / คุณกำลังบอกให้เชลล์ "มองหาในไดเรกทอรีนี้" ส่วนที่สำคัญคือคุณต้องอยู่ในไดเรกทอรีเดียวกันกับไฟล์ที่ตั้ง

chmod +x ./my_fileของหลักสูตรเพื่อทำงานจริงปฏิบัติการนั้นจะต้องมีชุดปฏิบัติการบิตดังนั้นคุณจะต้อง

ดังนั้นขั้นตอนสำคัญ:

  1. cd ที่ที่คุณบันทึกไฟล์ ถ้ามันอยู่ใน~/Downloadsนั้นcd ~/Downloads
  2. เรียกใช้chmod +x ./truecrypt-7.2-setup-x86สิ่งนี้บอกว่า "ทำให้ไฟล์ truecrypt-7.2-setup-x86 ที่อยู่ในไดเรกทอรีนี้ทำงานได้"
  3. และตอนนี้ทำ sudo ./truecrypt-7.2-setup-x86

โปรดทราบว่าการใช้./ไม่ใช่พฤติกรรมแบบสุ่ม แต่จริง ๆ แล้วเป็นมาตรฐานที่ระบุโดยมาตรฐานส่วนต่อประสานระบบปฏิบัติการพกพา (aka POSIX)โดยเฉพาะดูส่วน "คำสั่งการค้นหาและการดำเนินการ"

ทำซ้ำข้อผิดพลาด

$ # my script is in ~/Downloads folder
$ stat -c "%n" /home/xieerqi/Downloads/my_script.sh                         
/home/xieerqi/Downloads/my_script.sh
$ # if I run sudo ./my_script.sh, we get an error
$ sudo ./my_script.sh
[sudo] password for xieerqi: 
sudo: ./my_script.sh: command not found
$ # of course the command not found because file is not in ./, not in this dir
$ # this is not  sudo's problem
$ # but sudo does indeed show the same error even if you're in same directory
$ cd ./Downloads/                                                                                                                                                      
$ sudo ./my_script.sh                                                                                                                                                  
[sudo] password for xieerqi: 
sudo: ./my_script.sh: command not found

หมายเหตุ : ข้อความแสดงข้อผิดพลาดที่ให้ไว้โดยsudoชัดเจนทำให้เข้าใจผิดดังนั้นนี่คือสิ่งที่จะต้องเก็บไว้ในใจ; อย่างไรก็ตามโปรดทราบว่านี่ไม่ใช่ประเด็นหลักของคำถามที่ OP ถาม

เอกสารและการอ้างอิง

จากbashคู่มือ 4.3 ส่วน "คำสั่งปฏิบัติการ":

หากชื่อนั้นไม่ใช่ฟังก์ชั่นของเชลล์หรือตัวบิวอินและไม่มีเครื่องหมายสแลช, bash จะค้นหาแต่ละองค์ประกอบของ PATH เพื่อหาไดเร็กตอรี่ที่มีไฟล์ที่ใช้งานได้ตามชื่อนั้น

จากเหตุใดคุณจึงต้องการ. / (dot-slash) หน้าชื่อสคริปต์เพื่อเรียกใช้ใน bash :

มันทำงานร่วมกับ. / เพราะPOSIX ระบุว่าชื่อคำสั่งที่มี / จะถูกใช้เป็นชื่อไฟล์โดยตรงยับยั้งการค้นหาใน $ PATH คุณสามารถใช้เส้นทางแบบเต็มเพื่อให้ได้เอฟเฟกต์เหมือนกัน แต่. / สั้นกว่าและเขียนง่ายกว่า


sudoเอาท์พุทจริงทำให้เข้าใจผิด ถ้าคุณพยายามที่เดียวกันโดยไม่ต้องsudoคุณจะได้รับข้อผิดพลาดอื่นจาก:bash Permission deniedและอย่างถูกต้องเนื่องจากคุณไม่ได้รับสิทธิ์สคริปต์ให้ดำเนินการ (ผ่านchmod +x)
Ruslan

@Ruslan ความจริงที่ว่าsudoเอาต์พุตนั้นทำให้เข้าใจผิดเป็นความจริง แต่นั่นเป็นข้อผิดพลาดที่ปรากฏขึ้น นั่นอาจเป็นสิ่งที่ต้องรายงานให้นักพัฒนาและให้พวกเขาแก้ไข อย่างไรก็ตามนี่ไม่ใช่ประเด็นหลักของการสนทนา - เราจำเป็นต้องสร้างสิ่งที่ OP ได้ทำเพื่อสร้างข้อผิดพลาดดังกล่าวและนำพวกเขาไปสู่เส้นทางที่ถูกต้อง ไม่ว่าจะเป็นการหลอกลวงหรือไม่ - นั่นไม่ใช่ปัญหาที่นี่
Sergiy Kolodyazhnyy

ในทางอื่นมันไม่เหมือนกับการใช้/bin/bash: มันไม่อนุญาตให้คุณรันสคริปต์ที่คุณไม่ได้รับอนุญาตให้ดำเนินการ เมื่อคุณคำนำชื่อสคริปต์ด้วย/bin/bashความจริงที่ว่า/bin/bashเป็นปฏิบัติการเป็นเรื่องทั้งหมดที่เป็นมันเป็นคำสั่งที่กำลังดำเนินการ เมื่อคุณไม่ทำเช่นนั้นสคริปต์จะถูกดำเนินการซึ่งจะนำไปสู่เชลล์ปัจจุบันของคุณหรือสิ่งใดก็ตามที่อยู่ใน#!บรรทัดบนสุดที่ถูกเรียกใช้
Monty Harder

@MontyHarder /bin/bashเป็นเพียงตัวอย่างที่นี่ ความจริงที่ว่าเรากำลังโทรศัพท์/bin/bashและ./script.sh โดยการระบุ เส้นทางไปยังสิ่งที่กำลังดำเนินการ - นั่นคือสิ่งเดียวกัน การกำหนดค่าสคริปต์ล่วงหน้าด้วยbash script.shหรือ/bin/bash script.shเป็นหัวข้อที่แตกต่างอย่างสิ้นเชิงโดยที่คุณเรียกใช้ไฟล์สั่งการและเรียกใช้สคริปต์ในรูปแบบอาร์กิวเมนต์ซึ่งโดยวิธีสามารถแบ่งได้หากมีการเขียนไวยากรณ์ให้กับสิ่งอื่นที่ไม่ใช่เปลือกที่คุณเรียกcshใช้ /bin/bashสามารถใช้งานได้จริง แต่ความจริงก็คือคุณยังคงระบุเส้นทางแบบเต็มไว้
Sergiy Kolodyazhnyy

2
@SergiyKolodyazhnyy คำปรารภชื่อสคริปต์ด้วย/bin/bashหรือแม้เพียงแค่bashเป็นยังเป็นวิธีการทั่วไปในการแก้ปัญหาการขาดของสิทธิ์ที่ปฏิบัติการในสคริปต์ การระบุพา ธ สคริปต์แบบเต็มไม่สามารถแก้ปัญหานั้นได้ ดังนั้นจึง/bin/bashเป็นตัวอย่างที่ไม่ดีโดยเฉพาะอย่างยิ่งในกรณีเฉพาะนี้
Monty Harder
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.