คำถามติดแท็ก shell

เชลล์เป็นอินเตอร์เฟสบรรทัดคำสั่งของ Unix คุณสามารถพิมพ์คำสั่งในเชลล์แบบโต้ตอบหรือเขียนสคริปต์เพื่อทำงานอัตโนมัติ ใช้แท็กนี้สำหรับคำถามที่ใช้กับ / bin / sh และเชลล์ที่เข้ากันได้มากที่สุด (ash, bash, ksh, zsh, …) สำหรับเชลล์สคริปต์ที่มีข้อผิดพลาดโปรดตรวจสอบใน http://shellcheck.net ก่อนโพสต์ที่นี่

11
ฉันจะพิมพ์บรรทัดจากไฟล์ย้อนหลังได้อย่างไร (โดยไม่ใช้“ tac”)
คำถามนี้ถูกโยกย้ายจาก Stack Overflow เพราะสามารถตอบได้ใน Unix & Linux Stack Exchange อพยพ 8 ปีที่แล้ว ฉันต้องการพิมพ์บรรทัดจากไฟล์ข้างหลังโดยไม่ใช้tacคำสั่ง มีวิธีอื่นในการทำสิ่งนั้นด้วยการทุบตี?

2
Bash“ for” loop โดยไม่มีส่วน“ in foo bar …”
ฉันเพิ่งดูรหัสบางอย่างที่สับสนฉันเพราะมันใช้งานได้และฉันไม่ได้คาดหวัง รหัสย่อมาจากตัวอย่างนี้ #!/bin/bash for var; do echo "$var" done เมื่อรันด้วยอาร์กิวเมนต์บรรทัดคำสั่งจะพิมพ์ออกมา $ ./test a b c a b c นี่คือสิ่งที่คาดไม่ถึงสำหรับฉัน เหตุใดจึงไม่ส่งผลให้เกิดข้อผิดพลาดเนื่องจากvarไม่ได้กำหนดไว้? การใช้สิ่งนี้ถือว่าเป็น 'การปฏิบัติที่ดี' หรือไม่?

4
ทำไมฉันต้องใช้ cd“ $ @” แทน cd“ $ 1” เมื่อเขียน wrapper สำหรับ cd?
ที่อื่นฉันได้เห็นฟังก์ชั่น cd ดังนี้ cd() { builtin cd "$@" } ทำไมมันแนะนำให้ใช้$@แทน$1? ฉันสร้างไดเรกทอรีทดสอบ "r st" และเรียกว่าสคริปต์ที่มีฟังก์ชั่นนี้และทำงานได้ทั้งสองวิธี $ . cdtest.sh "r st" แต่ $ . cdtest.sh r stล้มเหลวไม่ว่าฉันจะใช้"$@"หรือ"$1"

3
ลบ ^ C เมื่อ CTRL + C
มีวิธีใดบ้างที่จะลบ^Cเมื่อคุณกดCTRL+ Cในเชลล์รวมกับ Red Hat Enterprise Linux 6 ("Santiago")? .bash_profileฉันมีสิทธิ์ในการแก้ไขของตัวเอง
25 shell 

2
การเปิดพรอมต์คำสั่งของคุณในโปรแกรมแก้ไขข้อความ - สิ่งนี้เรียกว่าอะไร
หนึ่งในเทคนิคที่ฉันโปรดปรานใน Bash คือเมื่อฉันเปิด command prompt ใน text editor ฉันทำเช่นนี้ (ในโหมด vi) ESC vโดยการกด เมื่อฉันทำสิ่งที่อยู่ในพรอมต์คำสั่งของฉันจะปรากฏใน $ EDITOR ที่ฉันเลือก ฉันสามารถแก้ไขคำสั่งราวกับว่ามันเป็นเอกสารและเมื่อฉันบันทึกและออกจากทุกสิ่งในไฟล์ชั่วคราวนั้นจะถูกดำเนินการ ฉันประหลาดใจที่เพื่อนของฉันไม่เคยได้ยินคำแนะนำนี้ดังนั้นฉันจึงมองหาเอกสารที่ฉันสามารถแบ่งปันได้ ปัญหาคือฉันไม่พบอะไรเลย นอกจากนี้คำค้นหาที่เกี่ยวข้องกับเคล็ดลับนี้เป็นเรื่องธรรมดามากดังนั้นจึงไม่ช่วยเมื่อ Googling สำหรับเอกสาร ไม่มีใครรู้ว่าสิ่งที่เรียกว่าเทคนิคนี้เพื่อให้ฉันสามารถค้นหาได้จริง?

2
วิธีการพกพา (POSIX) เพื่อให้เกิดการทดแทนกระบวนการคืออะไร?
เชลล์บางตัวbashสนับสนุนการทดแทนกระบวนการซึ่งเป็นวิธีการนำเสนอผลลัพธ์กระบวนการเป็นไฟล์เช่นนี้: $ diff <(sort file1) <(sort file2) อย่างไรก็ตามโครงสร้างนี้ไม่ใช่POSIXและไม่ใช่พกพา วิธีสามารถดำเนินการเปลี่ยนตัวทำได้ในPOSIXลักษณะที่เป็นมิตร (เช่นหนึ่งซึ่งทำงาน/bin/sh) ? หมายเหตุ: คำถามไม่ได้ถามว่าจะแตกไฟล์ที่จัดเรียงสองไฟล์ได้อย่างไรซึ่งเป็นเพียงตัวอย่างที่ประดิษฐ์ขึ้นเพื่อสาธิตการทดแทนกระบวนการ !

2
มีปัญหากับเครื่องหมายขีดคั่นในฟังก์ชันนามแฝงและไฟล์เรียกทำงานหรือไม่?
ในการทดสอบของฉัน (ใน Bash และ Z Shell) ฉันไม่เห็นปัญหาเกี่ยวกับการกำหนดฟังก์ชั่นหรือชื่อแทนหรือสคริปต์เชลล์ปฏิบัติการที่มียัติภังค์ในชื่อ แต่ฉันไม่มั่นใจว่าสิ่งนี้จะใช้ได้ในทุกเชลล์และทุกกรณี . เหตุผลที่ฉันต้องการทำเช่นนี้ก็คือยัติภังค์พิมพ์ได้ง่ายกว่าขีดล่างและเร็วกว่าและราบรื่นกว่า เหตุผลหนึ่งที่ฉันลังเลที่จะเชื่อว่ามันไม่ใช่ปัญหาคือในบางภาษา (ตัวอย่างเช่นทับทิม) ยัติภังค์จะถูกตีความว่าเป็นเครื่องหมายลบแม้ไม่มีที่ว่างรอบ ๆ มันจะไม่แปลกใจเลยถ้าบางสิ่งเช่นนี้อาจเกิดขึ้นในหอยบางตัวซึ่งยัติภังค์ถูกตีความว่าเป็นการส่งสัญญาณตัวเลือกแม้ไม่มีพื้นที่ อีกเหตุผลที่ฉันสงสัยอยู่เล็กน้อยว่าตัวแก้ไขข้อความของฉันทำให้ไวยากรณ์ที่เน้นสำหรับฟังก์ชันกับยัติภังค์เพิ่มขึ้น (แต่แน่นอนว่าเป็นไปได้ทั้งหมดที่เป็นเพียงข้อบกพร่องในการเน้นการกำหนดค่าไวยากรณ์สำหรับเชลล์สคริปต์) มีเหตุผลใดที่จะหลีกเลี่ยงยัติภังค์หรือไม่?
25 bash  shell  zsh  ksh  csh 

4
ข้อผิดพลาดสคริปต์ทุบตีกับสตริงที่มีเส้นทางที่มีช่องว่างและสัญลักษณ์
ฉันมีปัญหาในการเข้าใจพื้นฐานของการเขียนสคริปต์ Bash นี่คือสิ่งที่ฉันมี: #!/bin/bash FILES="/home/john/my directory/*.txt" for f in "${FILES}" do echo "${f}" done สิ่งที่ฉันต้องการทำคือรายการ.txtไฟล์ทั้งหมดในforลูปเพื่อให้ฉันสามารถทำสิ่งกับพวกเขา แต่พื้นที่ในmy directoryและเครื่องหมายดอกจันใน*.txtเพียงไม่เล่นอย่าง ฉันลองใช้มันโดยไม่ใส่เครื่องหมายอัญประกาศคู่โดยมีและไม่มีเครื่องหมายปีกกาบนชื่อตัวแปรและยังไม่สามารถพิมพ์.txtไฟล์ทั้งหมดได้ นี่เป็นสิ่งพื้นฐานมาก แต่ฉันยังคงดิ้นรนเพราะฉันเหนื่อยและคิดไม่ออก ผมทำอะไรผิดหรือเปล่า? ฉันสามารถใช้สคริปต์ด้านบนได้สำเร็จหากไฟล์ของฉันไม่มีที่ว่างหรือเครื่องหมายดอกจัน ... ฉันต้องทำการทดสอบว่ามีหรือไม่มีการใช้เครื่องหมายคำพูดคู่และเครื่องหมายปีกกาเพื่อให้มันทำงานได้หรือไม่ แต่ช่วงเวลาที่ฉันมีทั้งช่องว่างและดอกจันมันทำให้ทุกอย่างยุ่ง

2
fork () อยู่ที่ fork fork ที่ไหน: () {: |: &};:?
คำเตือน: การเรียกใช้คำสั่งนี้ในเชลล์ส่วนใหญ่จะส่งผลให้ระบบแตกหักซึ่งจะต้องบังคับให้ปิดระบบเพื่อแก้ไข ฉันเข้าใจฟังก์ชั่นวนซ้ำ:(){ :|: & };:และสิ่งที่ทำ แต่ฉันไม่รู้ว่าระบบสายส้อมอยู่ที่ไหน ผมไม่แน่ใจ |แต่ผมสงสัยว่าในท่อ

3
shellcheck ไม่แนะนำให้ใช้ basename: ทำไม
ฉันกำลังพยายามออกshellcheck ฉันมีบางอย่างเช่นนั้น basename "${OPENSSL}" และฉันได้รับคำแนะนำต่อไปนี้ Use parameter expansion instead, such as ${var##*/}. จากมุมมองจริงฉันไม่เห็นความแตกต่าง $ export OPENSSL=/opt/local/bin/openssl $ basename ${OPENSSL} openssl $ echo ${OPENSSL##*/} openssl เนื่องจากbasenameเป็นข้อมูลจำเพาะของ POSIXฉันจึงไม่มีเหตุผลว่าทำไมจึงควรเป็นวิธีปฏิบัติที่ดีที่สุด คำใบ้ใด ๆ

2
กำลังลบช่องว่างแท็บบรรทัดใหม่ ฯลฯ ออกจากตัวแปรหรือไม่
นี่เป็นข้อผิดพลาดที่ฉันได้รับและมันล้มเหลวเนื่องจากตัวแปรที่มีค่าควรจะเป็น 2 (ฉันได้รับสิ่งนี้โดยใช้กselect * from tabel) ฉันได้รับช่องว่างในตัวแปรนั้น + 0 != 2 ./setjobs[19]: 0: not found. ฉันจะลบช่องว่างเหล่านั้นทั้งหมดหรือขึ้นบรรทัดใหม่ออกจากตัวแปรนั้นได้อย่างไร Can tr, sedหรืออะไรความช่วยเหลือ? นี่คือสิ่งที่ฉันทำ: set_jobs_count=$(echo "set heading off; select count(*) from oppar_db where ( oppar_db_job_name, oppar_db_job_rec ) in ($var) ;" | \ sqlplus -s ${OP_ORA_USER}/${OP_ORA_PASS}@$OPERATIONAL_DB_NAME) ใช้งานได้ตามที่แนะนำ: | sed 's/[[:space:]]//g' แต่ฉันยังคงได้รับค่าเช่น: set_jobs_count= 2
25 shell  sed  tr  whitespace  newlines 

6
มีวิธีตั้งค่าขนาดของรายการประวัติเป็น bash มากกว่า 5,000 บรรทัดหรือไม่?
คำถามนี้ถูกโยกย้ายจาก Stack Overflow เพราะสามารถตอบได้ใน Unix & Linux Stack Exchange อพยพ 8 ปีที่ผ่านมา ไม่ว่าฉันจะตั้งค่าHISTSIZEตัวแปรสภาพแวดล้อมให้ใหญ่กว่า 5,000 เท่าไหร่เมื่อพิมพ์รายการประวัติด้วยhistorybuiltin มันจะพิมพ์เฉพาะคำสั่ง 5000 ล่าสุดเท่านั้น ฉันต้องการสิ่งนั้นเพราะฉันมักจะมีขนาดใหญ่.bash_historyซึ่งเกิน 5,000 บรรทัดและบางครั้งหนึ่งต้องระบุคำสั่งก่อนหน้าโดยกดCtrl-Rแต่ถ้าคำสั่งนั้นมากกว่า 5,000 คำสั่งก่อนหน้าฉันไม่สามารถเข้าถึงได้โดยใช้กลไกนั้น ฉันรู้ว่าฉันสามารถใช้grepบน.bash_historyแต่ผมคิดว่าCtrl-Rกลไกที่จะมากขึ้นเร็วขึ้น (และสะดวก) ฉันใช้ gnu bash เวอร์ชั่น 4.1 นั่นคือเนื้อหาทั้งหมดของไฟล์. bashrc ของฉัน: #!/bin/bash # ~/.bashrc: executed by bash(1) for non-login shells. # see /usr/share/doc/bash/examples/startup-files (in the package bash-doc) # …
25 linux  bash  shell 

7
วิธีตรวจสอบว่า $ PWD เป็นไดเรกทอรีย่อยของเส้นทางที่กำหนดหรือไม่
เช่นตรวจสอบว่า$PWDเป็นไดเรกทอรีย่อยของ / home ในคำอื่น ๆ ที่ฉันกำลังค้นหาการดำเนินการสตริงทุบตีเพื่อตรวจสอบว่าหนึ่งสตริงเริ่มต้นด้วยอีก
25 bash  shell  directory  string 


6
ฉันจะตรวจสอบการอนุญาตซ้ำ ๆ ย้อนกลับได้อย่างไร
มีคำสั่งฉันคิดว่ามันมาพร้อมกับ apache หรือเกี่ยวข้องกับมันอย่างใดอย่างหนึ่งที่ตรวจสอบสิทธิ์ตลอดทางลง ดังนั้นถ้ามี/home/foo/bar/bazก็จะบอกฉันว่าสิทธิ์ที่มีการbaz, bar, และfoo homeไม่มีใครรู้ว่าคำสั่งนี้หรือวิธีการทำเช่นนี้? โดยพื้นฐานแล้วคำสั่งเริ่มต้นที่อาร์กิวเมนต์และทำงานเป็นวิธีขึ้นเพื่อ/แจ้งให้คุณทราบว่ามีการอนุญาตไปพร้อมกันเพื่อให้คุณสามารถดูว่าคุณมีปัญหาการอนุญาต

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