Bash: การใช้ประเภท (Bash builtins) คืออะไร?


16

ฉันเจอคำสั่งในสคริปต์ Bash ที่ฉันพบ:

find /var/log/abcd -type f

คำสั่งดังกล่าวอยู่ในบริบทของการทำความสะอาดไฟล์บันทึก ฉันรู้ว่าสิ่งที่findทำ

หลังจากได้เห็น-type fฉันดูหน้าคู่มือด้วยตนเอง ฉันได้เห็นมันใน man page ของBASH_BUILTINS (1)

คำอธิบายของแฟล็ก -f ภายใต้typeคำสั่งคือ: -

The -f option suppresses shell function lookup, as with the command builtin.

ต่อไปนี้เป็นคำถามของฉัน:

  1. การใช้งานtypeคืออะไร?
  2. ความสำคัญของการ-fตั้งค่าสถานะคืออะไร?
  3. การใช้typeกับfindคำสั่งคืออะไร

[แก้ไข]: -หลังจากที่ได้อ่านความคิดเห็นทั้งหมดและคำตอบจนถึงตอนนี้ผมอยากจะพูดถึงสาเหตุการเข้าใจผิดของฉันVs-type option in command find type commandทั้งหมดนี้เกิดขึ้นเพราะผมสมมติและจนถึงวันที่ได้เห็นเพียงตัวเลือกสั้น (การทดสอบในกรณีของfindคำสั่ง) ที่มีเครื่องหมายลบเดียว '-' , ls -lตัวอย่างเช่น มากที่สุดเท่าที่ผมเคยเห็นตัวเลือกยาวที่มีเครื่องหมายลบคู่ '-' , ls --versionตัวอย่างเช่น


1
typeคำสั่ง builtin findจะไม่ใช้ -typeตัวเลือกที่จะfindไม่ทำอย่างอื่น ดูhelp typeและman findรับคำตอบของคุณ

1
การตีความผิดที่เฉพาะเจาะจงนี้มีความเฉพาะเจาะจงมากและไม่น่าจะช่วยผู้อื่นในเรื่องคำถาม
Anthon

9
ทำไมต้อง downvoting ในขณะที่คำถามแสดง OP ไม่ทราบมากเกี่ยวกับ Unix แต่นั่นไม่ถูกต้องที่จะลงคะแนนคำถามในพื้นที่เหล่านั้น Akshay ถึงกับไปอ่านหน้าคนที่คนส่วนใหญ่ถามคำถามที่นี่ไม่ได้ทำ
Stéphane Chazelas

โปรดพิจารณาการใช้ถ้อยคำชื่อคำถามของคุณใหม่เพราะชื่อปัจจุบันของคุณป้องกันไม่ให้คนที่กำลังมองหาการใช้ bash ในตัว 'พิมพ์' จากการได้รับคำตอบที่ถูกต้อง
Sajuuk

คำตอบ:


21

ในกรณีtypeนี้ไม่มีอะไรเกี่ยวข้องกับ bash ในตัวtypeแต่จะเพิ่มเติมในภายหลัง

เล็กน้อยเกี่ยวกับ"ประเภท"

typeคำสั่งในตัว BASH ให้ข้อมูลเกี่ยวกับคำสั่งแก่คุณ ดังนั้น:

$ type type
type is a shell builtin

ไวยากรณ์คือ:

type [-tap] [name ...]
  • -t: พิมพ์เฉพาะประเภทหากพบ
  • -a: พิมพ์คำสั่งทั้งหมดที่เกิดขึ้นทั้งในตัวและอื่น ๆ
  • -p: พิมพ์ไฟล์ดิสก์ที่จะถูกดำเนินการเมื่อมีคำสั่งโทรหรือไม่มีอะไร

ถ้าเราดูที่time, killและcatเป็นตัวอย่าง:

$ type time kill cat
time is a shell keyword
kill is a shell builtin
cat is /bin/cat

$ type -t time kill cat
keyword
builtin
file

$ type -a time kill cat
time is a shell keyword
time is /usr/bin/time
kill is a shell builtin
kill is /bin/kill
cat is /bin/cat

$ type -ta time kill cat
keyword
file
builtin
file
file

ตอนนี้ระบุว่าถ้าคุณอยู่ในเปลือก Bash และประเภทtime some_cmdbash builtin timeจะใช้ ที่จะใช้ระบบที่คุณสามารถทำได้time/usr/bin/time some_cmd

วิธีการหนึ่งที่มักจะใช้เพื่อให้มั่นใจว่าระบบและไม่ได้ในตัว, whichคำสั่งที่ใช้คือการใช้

tt=$(which time)

และจากนั้นใช้กับระบบการโทร$tttime


คำสั่งในคำถาม

ในกรณีนี้เป็นตัวเลือกในการคำสั่ง-type findตัวเลือกใช้เวลาหนึ่งอาร์กิวเมนต์โดยที่ระบุประเภทของกิจการ ตัวอย่าง

find . -type f  # File
find . -type d  # Directory

มีมากขึ้นตรวจสอบman findส่วนที่เหลือ

ในการค้นหาตัวเลือกเฉพาะที่คุณสามารถทำได้ (ในขณะที่อยู่ในคน):

/ ^ \ s * ประเภทEnter

จากนั้นใช้nสำหรับถัดไปจนกว่าคุณจะพบมัน


คำสั่งเกี่ยวกับเชลล์เล็กน้อย

นี่คือการตีความส่วนตัวเล็กน้อย

บางสิ่งที่ควรกล่าวถึงในกรณีนี้คือคำสั่งตัวเลือกอาร์กิวเมนต์และไพพ์

สิ่งนี้ค่อนข้างใช้อย่างหลวม ๆ แต่ในคำศัพท์ของฉันเรามีสั้น:

  • คำสั่ง: โปรแกรมหรือในตัว
  • พารามิเตอร์: เอนทิตีหลังจากคำสั่ง
  • ตัวเลือก: พารามิเตอร์ที่เป็นตัวเลือก
  • อาร์กิวเมนต์: พารามิเตอร์ที่ต้องการ

ในคำสั่งวงเล็บเหลี่ยมสเปคคำสั่งจะใช้ในการระบุตัวเลือกและน้อยกว่า / มากกว่านั้นใช้เพื่อระบุอาร์กิวเมนต์ ดังนั้น:

foo [-abs] [-t <bar>] <file> ...
foo [-abs] [-t bar] file ...

ให้-a -bและ-sเป็นพารามิเตอร์ทางเลือกและfileจำเป็นต้องมี -tเป็นตัวเลือก barแต่ถ้าระบุต้องใช้อาร์กิวเมนต์ที่จำเป็น จุดแสดงว่ามันสามารถใช้ไฟล์หลายไฟล์

นี่ไม่ใช่ข้อกำหนดที่แน่นอนและบ่อยครั้งmanหรือhelpจำเป็นต้องมีเพื่อให้แน่ใจ

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

chmod -R nick 722 foo
chmod nick 722 foo -R

ทั้งสองทำงานในบางระบบในขณะที่ระบบไม่ทำงาน


ในคำสั่งที่แน่นอนพารามิเตอร์ทั้งหมดเป็นของfind- ดังนั้นหากคุณสงสัยเกี่ยวกับคุณสมบัติman findเป็นสถานที่ที่ถูกต้องในการค้นหา ในกรณีที่คุณจำเป็นต้องดู man pages สำหรับ shell และอื่น ๆ อาจเป็นเช่น:

find . $(some command)
find . `some command`
find . $some_var
find . -type f -exec some_command {} \;
find . -type f | some_command
...

-execเป็นคนพิเศษที่-exec some_command {} \;มีพารามิเตอร์ทั้งหมดมอบให้กับfindแต่some_command {} \;ส่วนที่มีการขยายภายในเพื่อfindsome_command string_of_found_entity


เพิ่มเติมเกี่ยวกับ

  • ข้อความ
  • การขยาย
  • การทดแทนคำสั่ง
  • และอีกมากมาย

คุณอาจพบว่ามีประโยชน์นี้


ข้อมูลมาก
Fredrick Gauss

8

คุณ shoul มองในman findไม่ได้อยู่ในหรือhelp type ในจะระบุประเภทของไฟล์ที่คุณต้องการ:man bashtypefind

   -type c
          File is of type c:

          b      block (buffered) special

          c      character (unbuffered) special

          d      directory

          p      named pipe (FIFO)

          f      regular file

          l      symbolic link; this is never true if the -L option or the
                 -follow option is in effect, unless the symbolic link  is
                 broken.  If you want to search for symbolic links when -L
                 is in effect, use -xtype.

          s      socket

          D      door (Solaris)

และในตัวเป็นสิ่งที่แตกต่างอย่างสิ้นเชิงและก็ไม่ได้หนึ่งถูกนำมาใช้ภายในtypefind


0

คุณมองไปที่หน้าคู่มือผิดนี่ไม่ใช่type -fคำสั่ง แต่find -type fตัวเลือกที่แตกต่างกันมากดูที่findคู่มือสำหรับคำอธิบายที่เหมาะสม


0

-type fบอกให้ค้นหาเฉพาะไฟล์พิมพ์ที่เป็นประเภท f เช่นไฟล์ธรรมดาไม่ใช่ไดเรกทอรีไม่ใช่ลิงก์สัญลักษณ์และไม่ใช่ไฟล์อุปกรณ์ man findจากนั้นค้นหา-fตัวเลือก


0

นี่ไม่ใช่หน้าคู่มือที่ถูกต้องที่คุณกำลังดู คุณควรจะใช้

man find

ที่จะบอกคุณว่ามีการเลือกกริยาเฉพาะไฟล์ปกติ-type f-type

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.