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

คำถามเฉพาะของ Bourne อีกครั้งของเชลล์ใน GNU เมื่อเทียบกับเชลล์ Bourne / POSIX อื่น ๆ สำหรับคำถามเกี่ยวกับเชลล์ Unix โดยทั่วไปให้ใช้ / เชลล์แท็กแทน

5
ฉันจะออกจากสคริปต์ในคำสั่งแบบมีเงื่อนไขได้อย่างไร
ฉันกำลังเขียนสคริปต์ทุบตีที่ฉันต้องการออกหากผู้ใช้ไม่ได้รูท เงื่อนไขทำงานได้ดี แต่สคริปต์ไม่ออก [[ `id -u` == 0 ]] || (echo "Must be root to run script"; exit) ฉันลองใช้&&แทนที่จะใช้;แต่ไม่ได้ผล

3
การปิดไฟล์ descriptor,> & - vs <& -
ในการกวดวิชาทุบตีฉันอ่านมันบอกว่าถ้าคุณเปิดไฟล์อธิบายสำหรับการอ่านคือ exec 3&lt; echolist จากนั้นคุณต้องปิดมันแบบนี้ exec 3&lt;&amp;- อย่างไรก็ตามหากคุณเปิดไฟล์ descriptor เพื่อทำการเขียนจะต้องปิดดังนี้: exec 3&gt;&amp;- แต่เมื่อฉันดูบนอินเทอร์เน็ตฉันเห็นผู้คนกำลังเปิดไฟล์แล้วปิดด้วย: exec 3&gt;&amp;- หมายเหตุ:exec 3&lt;&amp;1เมื่อตามกวดวิชาที่พวกเขาควรจะใช้ ดังนั้นคำถามของฉันคือตัวอธิบายไฟล์ทั้งหมดสามารถปิดได้โดยexec n&gt;&amp;-ที่ n คือหมายเลขตัวอธิบายไฟล์หรือไม่ ไม่ว่าจะเปิดอ่านหนังสือเขียนหรือทั้งสองอย่าง

2
Bash: วิธีอ่านทีละหนึ่งบรรทัดจากเอาต์พุตของคำสั่ง?
while loopฉันพยายามที่จะอ่านผลลัพธ์ของคำสั่งในทุบตีใช้ที่ while read -r line do echo "$line" done &lt;&lt;&lt; $(find . -type f) ผลลัพธ์ที่ฉันได้รับ ranveer@ranveer:~/tmp$ bash test.sh ./test.py ./test1.py ./out1 ./test.sh ./out ./out2 ./hello ranveer@ranveer:~/tmp$ หลังจากนี้ฉันก็ลอง $(find . -type f) | while read -r line do echo "$line" done test.sh: line 5: ./test.py: Permission deniedแต่มันก็สร้างข้อผิดพลาด ดังนั้นฉันจะอ่านทีละบรรทัดได้อย่างไรเพราะฉันคิดว่าขณะนี้มันกำลังซัดทั้งบรรทัดในครั้งเดียว เอาต์พุตที่ต้องการ: ./test.py …
49 bash  shell  find  pipe 


5
วิธีรันคำสั่งติดต่อกันจากประวัติ
สมมติว่าฉันต้องการรันคำสั่งสี่คำสั่งที่ฉันได้ดำเนินการมาก่อน หากคนแรกคือ 432 ในประวัติศาสตร์คำสั่งจากนั้นฉันสามารถทำได้: $ !432; !433; !434; !435 ฉันอยากรู้อยากเห็นมีวิธีที่มีประสิทธิภาพมากขึ้นเพื่อให้บรรลุนี้

1
อะไรคือความแตกต่างระหว่างเครื่องหมายคำพูด“ …”, '…', $ '…' และ $“ …”?
บางครั้งผมเห็นสคริปต์ใช้ทั้งหมดของวิธีการที่แตกต่างกันเหล่านี้อ้างข้อความบางส่วน: "...", '...', และ$'...' $"..."เหตุใดจึงมีการใช้เครื่องหมายคำพูดต่าง ๆ มากมาย? พวกเขามีพฤติกรรมที่แตกต่างหรือส่งผลกระทบต่อสิ่งที่ฉันสามารถทำได้ภายในพวกเขา?

8
cron ละเว้นตัวแปรที่กำหนดใน“ .bashrc” และ“ .bash_profile”
ฉันได้กำหนดตัวแปร "SHELL" ในไฟล์ / etc / crontab: [martin@martin ~]$ grep SHELL /etc/crontab SHELL=/usr/local/bin/bash [martin@martin ~]$ file /usr/local/bin/bash /usr/local/bin/bash: ELF 32-bit LSB executable, Intel 80386, version 1 (FreeBSD), dynamically linked (uses shared libs), for FreeBSD 8.0 (800107), stripped [martin@martin ~]$ นอกจากนี้สคริปต์ของฉันทั้งหมดในไฟล์ / etc / crontab เริ่มต้นภายใต้ผู้ใช้ "มาร์ติน" อย่างไรก็ตาม/home/martin/.bash_profile (สำหรับ login shell) …
49 bash  cron 

4
พรอมต์ขอรหัสผ่าน sudo และยกระดับสิทธิ์โดยใช้โปรแกรมในสคริปต์ทุบตี?
ขณะนี้ฉันกำลังทำงานกับสคริปต์ทุบตีที่ติดตั้งและตั้งค่าโปรแกรมต่าง ๆ บนระบบ Linux ที่มีอยู่ในสต็อก (ปัจจุบันคือ Ubuntu) เนื่องจากมันติดตั้งโปรแกรมและคัดลอกไฟล์จำนวนหนึ่งไปยังโฟลเดอร์ต่าง ๆ ที่ต้องการการยกระดับสิทธิ์ฉันจึงได้ทำมาตรฐาน "ฉันต้องการสิทธิ์ในการยกระดับ" - และ - ออก อย่างไรก็ตามฉันต้องการถ้าเป็นไปได้เพื่อให้ผู้ใช้รหัสผ่าน sudo ของพวกเขาและยกระดับสิทธิ์ของสคริปต์โดยอัตโนมัติหากผู้ใช้ไม่ได้เรียกใช้คำสั่งสคริปต์ด้วย sudo (เช่นการเปิดใช้จากตัวจัดการไฟล์ GUI) โดยที่ผู้ใช้ไม่ต้องรีสตาร์ทสคริปต์ เนื่องจากได้รับการออกแบบให้ทำงานบนการติดตั้ง Linux ในสต็อกตัวเลือกใด ๆ ที่ปรับเปลี่ยนระบบจะไม่ทำงานตามวัตถุประสงค์ของฉัน ตัวเลือกทั้งหมดจะต้องมีตัวสคริปต์ เป็นไปได้ภายใน Bash หรือไม่ ถ้าเป็นเช่นนั้นวิธีที่ดีที่สุด (ปลอดภัย แต่รัดกุม) ในการทำเช่นนี้คืออะไร
49 bash  sudo 

6
เมื่อใดที่คุณใช้การขยายรั้ง
ฉันเข้าใจว่าการขยายรั้งคืออะไร แต่ฉันไม่รู้ว่าจะใช้งานได้อย่างไร คุณจะใช้เมื่อไหร่? กรุณาสอนตัวอย่างที่สะดวกและน่าทึ่งให้ฉันถ้าคุณมีเคล็ดลับของคุณเอง

1
ทำไมทุบตีไม่เก็บคำสั่งที่ขึ้นต้นด้วยช่องว่าง
ถ้าฉันทำลำดับของคำสั่งเช่น: $ ls $ grep abc file.txt จากนั้นใช้ปุ่มลูกศรขึ้นเพื่อรับค่าก่อนหน้าเทอร์มินัลจะแสดง cmd ล่าสุด (ซึ่งอยู่ที่grepนี่) แต่ถ้าฉันทำอะไรแบบนี้: $ ls $ grep abc file.txt ที่grepจะนำหน้าด้วยช่องว่างกดขึ้นจะช่วยให้ไม่ได้lsgrep ทำไมนี้


7
ทำไม ls -d ยังแสดงรายการไฟล์และเอกสารอยู่ที่ไหน?
เมื่อระบุls --directory a*ว่าควรแสดงเฉพาะไดเรกทอรีที่ขึ้นต้นด้วยa* แต่มันจะแสดงรายการไฟล์และไดเรกทอรีที่เริ่มต้นด้วย a คำถาม : ที่ฉันอาจพบเอกสารบางอย่างเกี่ยวกับเรื่องนี้อื่น ๆ กว่าmanและinfoที่ผมคิดว่าผมมองอย่างละเอียด? ทำงานใน BASH เท่านั้นหรือไม่
48 bash  shell  ls  wildcards  options 

4
ฉันจะลบองค์ประกอบออกจากอาร์เรย์ได้อย่างไร
unset array[0]เอาองค์ประกอบ แต่ถ้าฉันจะecho ${array[0]}ได้รับค่า Null นอกจากนี้ยังมีวิธีอื่นในการทำเช่นนี้ แต่ถ้าองค์ประกอบของอาร์เรย์มีช่องว่างเช่นด้านล่าง array[0]='james young' array[1]='mary' array[2]='randy orton' แต่สิ่งเหล่านี้ก็ไม่สามารถทำงานได้เช่นกัน array=${array[@]:1} #removed the 1st element ตอนนี้ฉันต้องการอาร์เรย์ใหม่ให้เป็นเหมือน array[0]='mary' array[1]='randy orton' ช่องว่างทำให้เกิดปัญหาหลังจากการกำหนดและอาร์เรย์ที่แท้จริงกลายเป็นเหมือนการทดแทน array=(mary randy orton)

2
วิธีแสดงตัวอธิบายไฟล์ที่เปิด แต่ไม่ได้ใช้คำสั่ง lsof
สวัสดีฉันได้อ่านที่นี่ว่า lsof ไม่ใช่วิธีที่ถูกต้องในการรับจำนวน File Descriptors ที่เปิดอยู่ในปัจจุบัน เขาแนะนำให้ใช้คำสั่งนี้แทน cat /proc/sys/fs/file-nr ในขณะที่คำสั่งนี้แสดงจำนวนของ FD คุณจะแสดงรายการตัวอธิบายไฟล์ที่เปิดซึ่งคำสั่งข้างต้นเพิ่งนับได้อย่างไร

16
ลบรายการ $ PATH ซ้ำด้วยคำสั่ง awk
ฉันพยายามเขียนฟังก์ชัน bash shell ที่จะอนุญาตให้ฉันลบสำเนาของไดเรกทอรีที่ซ้ำกันออกจากตัวแปรสภาพแวดล้อม PATH ของฉัน ฉันถูกบอกว่าเป็นไปได้ที่จะบรรลุสิ่งนี้ด้วยคำสั่งหนึ่งบรรทัดโดยใช้awkคำสั่ง แต่ฉันไม่สามารถหาวิธีที่จะทำได้ มีใครรู้บ้าง
48 bash  shell  awk  path 

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