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

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

4
เป็นไปได้ในทุบตีเพื่อเริ่มอ่านไฟล์จากการนับไบต์ arbitary นับ?
ฉันต้องการค้นหาวันที่ซึ่งอยู่ในบันทึก 8 GB (ข้อความ) ฉันสามารถข้ามการอ่านตามลำดับแบบเต็มได้หรือไม่และทำการแยกไบนารีของไฟล์ (ขนาด) หรือทำการสำรวจระบบไฟล์inodes(ซึ่งฉันรู้น้อยมาก ) เพื่อเริ่มอ่านจากจุดแยกแต่ละจุดจนกว่าฉันจะหาออฟเซ็ตที่เหมาะสมจาก จะเริ่มค้นหาข้อความเพื่อหาบรรทัดที่กำหนดวันที่ได้ที่ไหน tailการอ่านบรรทัดสุดท้ายไม่ได้ใช้การอ่านตามลำดับปกติดังนั้นฉันจึงสงสัยว่าสถานที่นี้มีให้บริการอย่างใดอย่างหนึ่งในทุบตีหรือฉันจะต้องใช้ Python หรือ C / C ++ ... แต่ฉันสนใจเฉพาะตัวbashเลือก ..

4
ชุดคำสั่งที่ไม่มีอาร์กิวเมนต์ทำอะไร
อะไรsetคำสั่งโดยไม่ขัดแย้งทำอย่างไร อย่างที่ฉันเห็นมันพิมพ์ตัวแปรสภาพแวดล้อมของฉันเหมือนกับenvคำสั่ง แต่ตามลำดับตัวอักษร และยิ่งไปกว่านั้นมันยังพิมพ์ข้อมูลที่แตกต่างกัน (ฟังก์ชั่นตัวแปร?) เช่น: __git_printf_supports_v=yes __grub_script_check_program=grub-script-check ... quote () { local quoted=${1//\'/\'\\\'\'}; printf "'%s'" "$quoted" } quote_readline () { local quoted; _quote_readline_by_ref "$1" ret; printf %s "$ret" } มันคืออะไรและมาจากไหน? ฉันไม่สามารถหาข้อมูลเกี่ยวกับsetคำสั่งโดยไม่มีข้อโต้แย้ง จริงๆแล้วฉันไม่มีmanหน้าสำหรับsetการแจกจ่าย Linux เลย
22 bash  set 

6
การใช้งานฟังก์ชั่น Bash Script กับ Sudo
ฉันมีสคริปต์ที่ทำสิ่งต่าง ๆ จำนวนมากซึ่งส่วนใหญ่ไม่ต้องการสิทธิ์พิเศษใด ๆ อย่างไรก็ตามหนึ่งส่วนเฉพาะซึ่งฉันมีอยู่ในฟังก์ชั่นต้องการสิทธิ์รูท ฉันไม่ต้องการให้สคริปต์ทั้งหมดทำงานเป็นรูทและฉันต้องการที่จะสามารถเรียกใช้ฟังก์ชั่นนี้ได้โดยใช้สิทธิ์รูทจากภายในสคริปต์ การขอรหัสผ่านหากจำเป็นไม่ใช่ปัญหาเนื่องจากส่วนใหญ่เป็นแบบโต้ตอบอยู่แล้ว อย่างไรก็ตามเมื่อฉันพยายามใช้sudo functionxฉันจะได้รับ: sudo: functionx: command not found อย่างที่ฉันคาดไว้exportก็ไม่ได้สร้างความแตกต่าง ฉันต้องการที่จะสามารถใช้งานฟังก์ชั่นโดยตรงในสคริปต์แทนที่จะแยกมันออกและดำเนินการเป็นสคริปต์แยกต่างหากด้วยเหตุผลหลายประการ มีวิธีที่ฉันสามารถทำให้ฟังก์ชั่น "มองเห็น" ของฉันไปยัง sudo โดยไม่ต้องแตกไฟล์ค้นหาไดเรกทอรีที่เหมาะสม ฟังก์ชั่นมีความยาวประมาณหนึ่งหน้าและมีหลายสตริง มันยังขึ้นอยู่กับฟังก์ชั่นเมนูที่กำหนดไว้ที่อื่นในสคริปต์หลัก ฉันคาดหวังว่าใครบางคนที่มี sudo ใด ๆ เท่านั้นที่สามารถเรียกใช้ฟังก์ชันได้เนื่องจากหนึ่งในสิ่งที่มันทำคือเปลี่ยนรหัสผ่าน
22 bash  sudo  function 

3
ใช้ grep ในคำสั่งเงื่อนไขในทุบตี
ฉันยังใหม่ต่อการเขียนสคริปต์ในการทุบตีและลองทำในสิ่งที่ฉันคิดว่าจะเป็นสิ่งพื้นฐาน ฉันต้องการเรียกใช้ DDNS ที่อัปเดตจากเซิร์ฟเวอร์ของฉันที่ใช้ Ubuntu 14.04 ยืมรหัสจาก dnsimple นี่คือสิ่งที่ฉันมี: #!/bin/bash LOGIN="email" TOKEN="token" DOMAIN_ID="domain" RECORD_ID="record" IP=`curl -s http://icanhazip.com/` OUTPUT=` curl -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "X-DNSimple-Domain-Token: $TOKEN" \ -X "PUT" \ -i "https://api.dnsimple.com/v1/domains/$DOMAIN_ID/records/$RECORD_ID" \ -d "{\"record\":{\"content\":\"$IP\"}}"` if ! echo "$OUTPUT" | grep -q "(Status:\s200)"; then echo "match" …

1
เป็น ((…)) {…;} ไวยากรณ์เชลล์ที่ถูกต้องหรือไม่ หอยไหน?
การแสดงออก: $ ksh -c 'for ((i=0;i<10;i++)){ echo $i;}' 0 1 2 3 4 ทำงานอย่างถูกต้อง ฉันล้มเหลวในการค้นหาคำอธิบายของไวยากรณ์นี้ซึ่ง{...;}แทนที่ด้วย; do ...; doneในคู่มือ มีการอ้างอิงในคู่มือหรือไม่? เชลล์ใดที่ทำงานได้ถูกต้อง?
21 bash  shell  zsh  ksh 

2
เหตุใดแบ็กสแลชจึงรวมอยู่ในเชลล์สคริปต์นี้
ในสำเนาconda.shสคริปต์ของฉันฉันเห็นบรรทัดต่อไปนี้: if [ -n "${_CE_CONDA}" ] && [ -n "${WINDIR+x}" ]; then SYSP=$(\dirname "${CONDA_EXE}") else SYSP=$(\dirname "${CONDA_EXE}") SYSP=$(\dirname "${SYSP}") fi ผมอยากรู้ว่าทำไมถึงมีการทับขวาในด้านหน้าในd dirnameฉันไม่เชื่อว่ามีความจำเป็น การใช้แบ็กสแลชนี้ปรากฏในที่อื่นในไฟล์ต้นฉบับ มีเหตุผลในการทำสิ่งนี้ที่ฉันหายไปหรือไม่?


10
Shell: เป็นไปได้ไหมที่จะชะลอคำสั่งโดยไม่ใช้ `sleep '?
มีการทดแทนทางเลือกหรือเทคนิคทุบตีสำหรับการชะลอคำสั่งโดยไม่ใช้sleepหรือไม่? ตัวอย่างเช่นการแสดงคำสั่งด้านล่างโดยไม่ใช้สลีปจริง: $ sleep 10 && echo "This is a test"

1
/ dev / tcp ไม่พบ
เมื่อฉันพยายามเรียกใช้คำสั่งต่อไปนี้: echo -e "GET / HTTP/1.1\n\n" | /dev/tcp/74.125.225.19/80 ฉันได้รับข้อความแสดงข้อผิดพลาดต่อไปนี้: bash: /dev/tcp/74.125.225.19/80: No such file or directory คำสั่งต่อไปนี้ทำงานได้อย่างสมบูรณ์ดังนั้นปัญหาเกี่ยวข้องกับวิธีที่ฉันใช้/dev/tcp: echo -e "GET / HTTP/1.1\n\n" | nc 74.125.225.19 80 ฉันอยู่ใน Ubuntu 13.04 ดังนั้นความสามารถควรอยู่ในระบบของฉัน ผมทำอะไรผิดหรือเปล่า? กฎการใช้งาน/dev/tcpอย่างเหมาะสมมีอะไรบ้าง
21 bash  tcp 

2
ฮาร์ดลิงก์นับเป็นไฟล์ปกติหรือไม่
ฉันสงสัยว่ามีวิธีในการลงทะเบียนหรือไม่ แต่เนื่องจากเครื่องมือค้นหาที่ทันสมัยส่วนใหญ่ทำงานได้ไม่ดีกับวลีที่มีความยาวประมาณ 5 คำฉันจึงต้องการความช่วยเหลือในส่วนนี้ ฉันสงสัยสิ่งนี้เพราะฉันกำลังสร้างสคริปต์ทุบตีที่ต้องลงทะเบียนไฟล์เป็นบางประเภทและตัดสินใจตามนั้น เทคนิคนี้ไม่สำคัญกับโครงการของฉัน แต่ฉันอยากรู้ นอกจากนี้หากไฟล์เหล่านั้นถูกพิจารณาว่าเป็นไฟล์ปกติก็มีวิธีตรวจสอบว่าไฟล์เหล่านี้เชื่อมโยงกันอย่างหนักหรือไม่โดยไม่ต้องแยกวิเคราะห์ls -i? และมีวิธีการตรวจสอบว่าไฟล์โดยพลการบางไฟล์, X, เชื่อมโยงกับไฟล์โดยพลการอื่น ๆ , Y, โดยไม่ใช้find -iคำสั่งหรือไม่?

1
ทำไมฟังก์ชั่นจะไม่กลับมาจนกว่ากระบวนการพื้นหลังจะสิ้นสุด
พิจารณาสคริปต์นี้: #!/bin/bash function start { leafpad & echo $! } PID=$(start) echo "PID is $PID" สคริปต์ไม่ดำเนินการผ่านวงเล็บปีกกาปิดจนกว่ากระบวนการ leafpad จะสิ้นสุดลงแม้ว่าจะเป็นกระบวนการพื้นหลัง ทำไมนี้ เป็นไปได้หรือไม่ที่จะเริ่มกระบวนการพื้นหลังจากฟังก์ชั่น?

3
การพิมพ์คำสั่งอื่นไปยัง STDIN ปลอดภัยหรือไม่ในขณะที่คำสั่งก่อนหน้านี้กำลังเขียนไปยัง STDOUT
บางทีนี่อาจเป็นคำตอบก่อนหน้านี้ฉันยินดีต้อนรับลิงก์ไปยังคำตอบอื่น ... ถ้าฉันรันคำสั่งเชลล์ (ในbashเชลล์) เช่นต่อไปนี้: make จากนั้นในขณะที่ผลผลิตจากการmakeถูกเลื่อนโดยจากSTDOUTของmakeคำสั่งถ้าผมพิมพ์make checkและกดenterก่อนที่คำสั่งแรกเสร็จสิ้นการดำเนินการเมื่อmakeคำสั่งในที่สุดก็เสร็จสิ้นคำสั่งต่อไปmake checkจะรับสิทธิและเรียกใช้ คำถามของฉันเป็นเพียง: สิ่งนี้เป็นอันตรายหรือไม่? มีพฤติกรรมที่คาดไม่ถึงใด ๆ จากการพิมพ์ที่รวดเร็วเช่นนี้หรือไม่? ทำไมสิ่งนี้ถึงได้ผลเช่นนี้?
21 bash  shell  stdout  stdin 

6
มีวิธีง่าย ๆ ในการผนวกบรรทัดต่อท้ายไฟล์นอกเหนือจาก `>> 'หรือไม่?
เมื่อเร็ว ๆ นี้ฉันกำลังสะท้อนประโยคสั้น ๆ ไปยังtree_holeไฟล์ ฉันใช้echo 'something' >> tree_holeเพื่อทำงานนี้ แต่ฉันก็มักจะกังวลว่าถ้าฉันใส่ผิด>แทนที่จะทำ>>เพราะฉันทำสิ่งนี้บ่อย ดังนั้นฉันจึงทำ bash func ทั่วโลกของตัวเองใน bashrc: function th { echo "$1" >> /Users/zen1/zen/pythonstudy/tree_hole; } export -f th แต่ฉันสงสัยว่ามีอีกวิธีที่ง่ายในการต่อท้ายบรรทัดของไฟล์ เพราะฉันอาจจำเป็นต้องใช้บ่อยครั้งในโอกาสอื่น ๆ มีผู้ใด?

6
แจ้งเตือนเมื่อกระบวนการทำงานเสร็จสิ้น
มีคำถามและคำตอบเล็กน้อยที่นี่เกี่ยวกับการแจ้งเตือนเมื่อกระบวนการเสร็จสมบูรณ์ / ออก ( 1 , 2 ) - แต่ทั้งหมดนี้ถือว่าผู้ใช้ออกกระบวนการดังกล่าวด้วยตนเองและสามารถเขียนสคริปต์ด้วยการแจ้งเตือนที่สร้างขึ้นใน สคริปต์ที่ควบคุมหรือไพพ์กระบวนการในการแจ้งเตือนบางประเภท สถานการณ์ของฉันคือฉันต้องการได้รับการแจ้งเตือนถึงความสมบูรณ์ / ออกของกระบวนการที่ผู้ใช้ของฉันไม่เริ่มต้น คือฉันกำลังประมวลผลไฟล์วิดีโอจำนวนมากบนเซิร์ฟเวอร์ Ubuntu 12.04 LTS การดำเนินการบางอย่างกับไฟล์เหล่านี้ใช้เวลานานมากดังนั้นฉันจึงต้องการการแจ้งเตือนบางอย่าง (อีเมลจะดีมาก) เมื่อไฟล์ใดไฟล์หนึ่งเสร็จสิ้น พวกเขาใช้เวลานานมากในการทำสิ่งนี้บนพื้นฐานแบบครั้งเดียวด้วยตนเองบนพื้นฐานของ PIT จะดีอย่างสมบูรณ์แบบ เพื่อให้ข้อมูลเพิ่มเติม - สมมติว่าฉันกำลังประมวลผลไฟล์ขนาดใหญ่โดยเฉพาะและฉันเห็นว่ามีการพัฒนาไปสู่สคริปต์ FFMPEG กระบวนการเองเป็นสคริปต์ไพ ธ อน (ซึ่งค่อนข้างซับซ้อนและไม่ได้เขียนด้วยตัวเองและบางอย่าง ฉันไม่ต้องการแก้ไข - แม้ว่ามันจะเป็นวิธีการตรรกะแรก) ฉันจินตนาการว่าการออกคำสั่งหรือสคริปต์ด้วย PID ของการเรียกใช้สคริปต์ python ที่กล่าวถึงเป็นข้อโต้แย้งและเมื่อกระบวนการที่ใช้ PID นั้นไม่ได้ทำงานอีกต่อไปสคริปต์แจ้งเตือนก็จะทำสิ่งนั้น ความคิดใด ๆ
21 bash  process  top  htop 

3
ดำเนินการบรรทัดคำสั่งด้วยหนึ่ง sudo
ตัวอย่างเช่นถ้าฉันต้องการสร้างไฟล์และป้อนข้อความในหนึ่งบรรทัดฉันสามารถเปลี่ยนเส้นทางผลลัพธ์ไปยังไฟล์ด้วยการใช้>โอเปอเรเตอร์: echo "something" > /path/foobar แต่ถ้าฉันไม่มีสิทธิ์เข้าถึงโฟลเดอร์/path/และต้องการสิทธิ์ sudo ฉันจะทำคำสั่งนี้ให้เหมือนกับผู้ใช้ปกติที่มีสิทธิ์ sudo ได้อย่างไร ฉันเหนื่อย sudo echo "something" > /path/foobar แต่นั่นไม่ได้ผลเพราะ sudo นับeditแต่เท่านั้น แต่ไม่ใช่สำหรับส่วนที่ถูกต้อง ของ> แน่นอนว่าฉันสามารถรูทก่อนด้วยsudo suหรือใช้teeแทน: echo "something" | sudo tee /path/foobar แต่ฉันต้องการหาวิธีแก้ปัญหาที่ฉันสามารถทำงานกับบรรทัดสุดท้ายแทนผ่าน sudo !! ไม่มีทางที่จะ "รีไซเคิล" บรรทัดสุดท้ายและเพิ่มsudoข้างหน้าใช่ไหม

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