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

คำถามเกี่ยวกับเชลล์สคริปต์ไฟล์เรียกทำงานที่ตีความโดยเชลล์ (bash, zsh ฯลฯ )

4
เป็นกลุ่ม: สร้างไฟล์ด้วย + x บิต
มีวิธีใดบ้างในการตั้งค่า+xบิตของสคริปต์ขณะที่สร้าง ตัวอย่างเช่นฉันวิ่ง: vim -some_option_to_make_file_executable script.sh และหลังจากบันทึกฉันสามารถเรียกใช้ไฟล์โดยไม่ต้องย้ายใด ๆ เพิ่มเติม PS ฉันสามารถเรียกใช้chmodจากvimหรือแม้กระทั่งจากคอนโซลตัวเอง แต่มันน่ารำคาญเล็กน้อยเพราะvimแนะนำให้โหลดไฟล์ นอกจากนี้ยังเป็นเรื่องน่ารำคาญที่จะพิมพ์chmodคำสั่งทุกครั้ง PPS มันจะเป็นการดีที่จะทำให้มันขึ้นอยู่กับนามสกุลของไฟล์ (ฉันไม่ต้องการปฏิบัติการ.txt:-))

2
ฉันจะลบไฟล์ทั้งหมดในโฟลเดอร์ที่ไม่ได้เข้าถึงในระยะเวลาหนึ่งได้อย่างไร
ฉันต้องการเรียกใช้งาน cron ทุกคืนที่ลบไฟล์ทั้งหมดในโฟลเดอร์ที่ไม่ได้เข้าถึงในหนึ่งสัปดาห์ขึ้นไป วิธีที่มีประสิทธิภาพมากที่สุดในการทำเช่นนี้ในทุบตีคืออะไร?

1
อะไรคือความแตกต่างระหว่าง. bashrc และ. inputput
ฉันใหม่เพื่อระบบยูนิกซ์และพบว่ามันน่าสนใจที่จะสร้างฟังก์ชั่นที่กำหนดเองและการกำหนดค่าในแฟ้มการตั้งค่าเหมือนและ.bashrc.inputrc อย่างไรก็ตามฉันไม่เข้าใจความแตกต่างระหว่างทั้งสอง .bashrcตัวอย่างเช่นเมื่อฉันสร้างนามแฝงผมใส่ไว้ใน Example 1: alias ...='cd ../../' .inputrcเมื่อฉันสร้างการดำเนินงานเช่นการใช้ปุ่มลูกศรที่จะมองหาคำสั่งก่อนหน้าหรือถัดไปผมใส่คำสั่งใน Example 2: "\e[A": history-search-backward ทำไมฉันต้องใส่มันในไฟล์การตั้งค่าที่ต่างกัน วิธีผมไม่เห็นความแตกต่างเมื่อจะนำสิ่งที่? ขอบคุณล่วงหน้า!

4
วิธีการทำให้ bash glob เป็นตัวแปรสตริง
ข้อมูลระบบ ระบบปฏิบัติการ: OS X bash: GNU bash, รุ่น 3.2.57 (1) - ปล่อย (x86_64-apple-darwin16) พื้นหลัง ฉันต้องการให้ไทม์แมชชีนแยกชุดไดเรกทอรีและไฟล์ออกจากโครงการ git / nodejs ทั้งหมดของฉัน ไดเรกทอรีโครงการของฉันอยู่ใน~/code/private/และดังนั้นฉันพยายามที่จะใช้ทุบตีวนลูปที่จะทำ~/code/public/tmutil ปัญหา เวอร์ชั่นสั้น หากฉันมีตัวแปรสตริงที่คำนวณได้kฉันจะทำให้มันกลมกลืนไปหรือขวาก่อน for-loop ได้อย่างไร: i='~/code/public/*' j='*.launch' k=$i/$j # $k='~/code/public/*/*.launch' for i in $k # I need $k to glob here do echo $i done k=$i/$jในรุ่นยาวด้านล่างนี้คุณจะเห็น ดังนั้นฉันไม่สามารถเข้ารหัสสตริงใน for for loop …

2
วิธีรับชื่ออุปกรณ์บล็อกจากชื่ออุปกรณ์พาร์ทิชัน?
ฉันกำลังมองหาวิธีพกพาที่จะได้รับชื่ออุปกรณ์บล็อกแม่ (เช่น/dev/sda) ให้ชื่ออุปกรณ์พาร์ทิชัน (เช่น/dev/sda1) ฉันรู้ว่าฉันสามารถทิ้งอักขระตัวสุดท้ายได้ แต่นั่นอาจไม่ได้ผลในบางกรณี: โดยทั่วไปแล้วเครื่องอ่านการ์ด MMC จะมีชื่อเหมือน/dev/mmcblk0ในขณะที่พาร์ทิชันของพวกเขามีชื่อเช่น/dev/mmcblk0p1(สังเกตเห็นพิเศษp) ทางเลือก: อุปกรณ์บล็อกบางตัวไม่มีตารางพาร์ติชั่นเลยและมีการจัดรูปแบบเป็นพาร์ติชันเดียว ในกรณีนี้อุปกรณ์พาร์ทิชันและอุปกรณ์บล็อกหลักเหมือนกัน ปริมาตร LVM เป็นปลาที่แตกต่างกันอย่างสิ้นเชิง ฉันไม่ต้องการสนับสนุนพวกเขาในตอนนี้ แต่ถ้าคำนึงถึงพวกเขาต้องการความพยายามเพิ่มเล็กน้อยฉันก็ไม่รังเกียจ

4
ให้สองคำสั่งพื้นหลังยุติหนึ่งที่เหลือเมื่อออกอย่างใดอย่างหนึ่ง
ฉันมีสคริปต์ทุบตีง่ายๆที่เริ่มต้นเซิร์ฟเวอร์สองเครื่อง: #!/bin/bash (cd ./frontend && gulp serve) & (cd ./backend && gulp serve --verbose) หากคำสั่งที่สองออกจากดูเหมือนว่าคำสั่งแรกยังคงทำงานอยู่ ฉันจะเปลี่ยนสิ่งนี้ได้อย่างไรหากคำสั่งใดคำสั่งหนึ่งจบลงคำสั่งอื่นจะถูกยกเลิก? โปรดทราบว่าเราไม่จำเป็นต้องตรวจสอบระดับข้อผิดพลาดของกระบวนการพื้นหลังไม่ว่าจะมีการออกจาก

3
ข้อโต้แย้งเชิงลบที่หัว / หาง
คำถามที่แตกต่างกันนี้ได้ถูกถามหลายครั้งในที่ต่างกัน แต่ฉันพยายามลบMบรรทัดสุดท้ายออกจากไฟล์โดยไม่มีโชค ตอบที่สองได้รับการโหวตมากที่สุดในคำถามนี้แนะนำให้ทำดังต่อไปที่จะกำจัดของบรรทัดสุดท้ายในแฟ้ม: head -n -1 foo.txt > temp.txt อย่างไรก็ตามเมื่อฉันลองใน OSX & Zsh ฉันจะได้รับ: head: illegal line count -- -1 ทำไมถึงเป็นอย่างนั้น? ฉันจะเอาM ที่ผ่านมาสายและแรก Nสายของไฟล์ที่กำหนดหรือไม่

5
ฉันจะลบสิทธิพิเศษรูทในเชลล์สคริปต์ได้อย่างไร
ตัวเลือก "--up" ใน OpenVPN โดยปกติจะใช้สำหรับการเราต์เป็นต้นดังนั้นมันจะถูกประมวลผลก่อนที่ OpenVPN จะลดระดับสิทธิ์การใช้งานของรูทเพื่อไม่ให้มีใครทำงาน อย่างไรก็ตามฉันกำลังเรียกใช้เชลล์สคริปต์ที่จำเป็นต้องเรียกใช้ในฐานะผู้ใช้ที่ไม่มีสิทธิพิเศษ ฉันจะทำอย่างไร ฉันได้ศึกษาสิทธิ์ของ Drop Processโดยเฉพาะคำตอบของพหุนามและ tylerl แต่ฉันไม่เข้าใจวิธีการใช้ ฉันทำงานใน Centos 6.5 และ suid ถูกบล็อกทั้งสองเป็น "chmod u + s" และเป็น "setuid ()" มีปลั๊กอิน OpenVPN ("openvpn-down-root.so") ซึ่งเปิดใช้งานสคริปต์ที่เรียกใช้โดยตัวเลือก "--down" เพื่อเรียกใช้เป็นรูท อาจมีสิ่งที่เทียบเท่าเช่น "openvpn-up-user.so" แต่ฉันไม่พบมัน Edit0 คำตอบต่อ Nikola Kotur ผมได้ติดตั้งเอียนเมเยอร์ runit แม้ว่าคำสั่ง chpst จะทำงานในเทอร์มินัล แต่ในสคริปต์ up มันล้มเหลวด้วย "ไม่พบคำสั่ง" สิ่งที่ใช้ได้คือ …

3
รหัสส่งคืนที่เชื่อถือได้ของกระบวนการพื้นหลัง
สมมติว่าชิ้นส่วนของรหัสทุบตีต่อไปนี้: foo > logfile 2>&1 & foo_pid=$! while ps -p$foo_pid do ping -c 1 localhost done wait $foo_pid if [[ $? == 0 ]] then echo "foo success" fi มีความปลอดภัยหรือไม่ที่จะสมมติว่า$?มีรหัสส่งคืนของfooและไม่ใช่รหัสส่งคืนpingใช่หรือไม่ หากคำตอบของคำถามนั้นคือ: "คุณไม่สามารถสันนิษฐานได้" แล้วฉันจะแก้ไขรหัสชิ้นนี้เพื่อให้แน่ใจว่า$?มีรหัสที่ส่งคืนได้fooอย่างไร

4
ลบอักขระสิ้นสุดบรรทัดออกจาก stdout หรือไม่ หลายบรรทัดเป็นบรรทัดเดียว
ฉันมีสคริปต์ที่แสดงผลข้อความต่อไปนี้ นี่คือผลลัพธ์จากโมเด็มNetSL 2210-02 ADSL2 ADSL Line State: Up ADSL Startup Attempts: 1 ADSL Modulation: DMT ADSL Data Path: Fast Datapump Version: DSP 7.2.3.0, HAL 7.2.1.0 SNR Margin: 8.20 9.00 dB Line Attenuation: 57.50 31.00 dB Output Power: 17.09 12.34 dBm Errored Seconds: 0 0 Loss of Signal: 0 476 Loss …

1
การอัปโหลดหลายไฟล์ผ่าน FTP โดยใช้ curl
ฉันกำลังพยายามอัพโหลดไฟล์ข้อความทั้งหมดภายในโฟลเดอร์ปัจจุบันผ่าน FTP ไปยังตำแหน่งเซิร์ฟเวอร์โดยใช้ curl ฉันลองบรรทัดต่อไปนี้: curl -T "{file1.txt, file2.txt}" ftp://XXX --user YYY โดยที่ XXX คือที่อยู่ IP ของเซิร์ฟเวอร์และ YYY เป็นชื่อผู้ใช้และรหัสผ่าน ฉันสามารถถ่ายโอน file1.txt ไปยังเซิร์ฟเวอร์ได้สำเร็จ แต่มันบ่นเกี่ยวกับไฟล์ที่สองว่า 'ไม่สามารถเปิด' file_name '!' ฉันสลับชื่อไฟล์และทำงานกับ file2.txt ไม่ใช่ file1.txt ดูเหมือนว่าฉันผิดไวยากรณ์ แต่นี่คือสิ่งที่คู่มือพูด? นอกจากนี้ฉันควรจะทำสิ่งนี้: curl -T *.txt ftp://XXX --user YYY เพราะฉันจะไม่รู้จักชื่อของไฟล์ txt ในโฟลเดอร์ปัจจุบันหรือจำนวนไฟล์ที่จะถ่ายโอนเสมอ ฉันคิดว่าฉันอาจต้องเขียนสคริปต์ทุบตีที่รวบรวมเอาท์พุทของls *.txtลงในอาเรย์และวางลงในรูปแบบไฟล์หลายไฟล์ที่ต้องการโดย curl ฉันไม่ได้ทำสคริปต์ทุบตีมาก่อน - นี่เป็นวิธีที่ง่ายที่สุดในการบรรลุเป้าหมายนี้หรือไม่?
14 shell-script  ftp  curl 

4
แยกหนึ่งฟิลด์จากอาร์เรย์ JSON เป็นอาร์เรย์ทุบตี
ฉันมีเอาต์พุต JSON ที่มีรายการของวัตถุที่เก็บอยู่ในตัวแปร (ฉันอาจไม่ได้ใช้ถ้อยคำที่ถูกต้อง) [ { "item1": "value1", "item2": "value2", "sub items": [ { "subitem": "subvalue" } ] }, { "item1": "value1_2", "item2": "value2_2", "sub items_2": [ { "subitem_2": "subvalue_2" } ] } ] ฉันต้องการค่าทั้งหมดสำหรับ item2 ในอาร์เรย์เพื่อให้สคริปต์ bash ทำงานบน ubuntu 14.04.1 ฉันได้พบวิธีมากมายในการรับผลลัพธ์ทั้งหมดลงในอาร์เรย์ แต่ไม่ใช่รายการที่ฉันต้องการ

3
echo หรือ print / dev / stdin / dev / stdout / dev / stderr
ฉันต้องการพิมพ์ค่าของ / dev / stdin, / dev / stdout และ / dev / stderr นี่คือสคริปต์ง่าย ๆ ของฉัน: #!/bin/bash echo your stdin is : $(</dev/stdin) echo your stdout is : $(</dev/stdout) echo your stderr is : $(</dev/stderr) ฉันใช้ท่อต่อไปนี้: [root@localhost home]# ls | ./myscript.sh [root@localhost home]# testerr | ./myscript.sh เพียง แต่$(</dev/stdin)ดูเหมือนว่าจะทำงานผมยังได้พบกับคนอื่น ๆ …

4
วนซ้ำผ่านโฟลเดอร์และไฟล์รายการ
ฉันมีโฟลเดอร์ชื่อ 'ตัวอย่าง' และมันมี 3 ไฟล์อยู่ในนั้น ฉันต้องการเขียนเชลล์สคริปต์ซึ่งจะอ่านไฟล์เหล่านี้ภายในโฟลเดอร์ตัวอย่างและโพสต์ไปยังไซต์ HTTP โดยใช้ curl ฉันเขียนสิ่งต่อไปนี้เพื่อแสดงรายการไฟล์ภายในโฟลเดอร์: for dir in sample/*; do echo $dir; done แต่มันให้ผลลัพธ์ต่อไปนี้กับฉัน: sample/log sample/clk sample/demo มันกำลังแนบโฟลเดอร์แม่ในนั้น ฉันต้องการผลลัพธ์ดังนี้ (ไม่มีชื่อโฟลเดอร์หลัก) log clk demo ฉันจะทำสิ่งนี้ได้อย่างไร

4
เก็บรหัสทางออกเมื่อวางกับ SIGINT และคล้ายกันหรือไม่
หากฉันใช้trapเช่นอธิบายไว้ในhttp://linuxcommand.org/wss0160.php#trapเพื่อจับ ctrl-c (หรือคล้ายกัน) และการล้างข้อมูลก่อนออกจากนั้นฉันจะเปลี่ยนรหัสออกที่ส่งคืน ตอนนี้อาจจะไม่สร้างความแตกต่างในโลกแห่งความเป็นจริง (เช่นเพราะรหัสออกไม่ได้พกพาและด้านบนของที่ไม่โปร่งใสตลอดเวลาตามที่กล่าวไว้ในรหัสทางออกเริ่มต้นเมื่อกระบวนการสิ้นสุดลง? ) แต่ฉันสงสัยว่ามี จริงๆแล้วไม่มีวิธีในการป้องกันและส่งคืนรหัสข้อผิดพลาดเริ่มต้นสำหรับสคริปต์ที่ถูกขัดจังหวะแทนหรือไม่ ตัวอย่าง (เป็น bash แต่คำถามของฉันไม่ควรพิจารณาเฉพาะ bash): #!/bin/bash trap 'echo EXIT;' EXIT read -p 'If you ctrl-c me now my return code will be the default for SIGTERM. ' _ trap 'echo SIGINT; exit 1;' INT read -p 'If you ctrl-c me now …

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