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

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

1
การขยายตัวแปรทางอ้อมใน POSIX เช่นเดียวกับในทุบตี?
เป็นไปได้หรือมีแฮ็กที่สง่างามที่จะทำการขยายตัวแปรทางอ้อมใน POSIX ที่สามารถทำได้ใน Bash? สำหรับบริบทฉันพยายามทำสิ่งต่อไปนี้: for key in ${!map_*} do # do something done แก้ไข: map_ชี้แจงฉันต้องการที่จะเข้าถึงเปลือกตัวแปรที่ขึ้นต้นด้วย

3
คัดลอกไฟล์จากโฟลเดอร์แชร์ Windows ไปยัง Unix
ฉันใหม่ทั้งหมดสำหรับ Unix ฉันกำลังเขียนสคริปต์ซึ่งจะคัดลอกไฟล์จากโฟลเดอร์แชร์ของ Windows ไปยัง Unix ใน Windows เมื่อฉันพิมพ์\\Servername.com\testfolderคำสั่ง Run ฉันสามารถเห็นtestfolderได้ ไดเรกทอรีtestfolderนี้เป็นโฟลเดอร์แชร์ผ่านเครือข่ายทั้งหมด ตอนนี้ฉันต้องการคัดลอกไฟล์บางไฟล์จากนั้นtestfolderไปยังเครื่อง Unix ฉันควรใช้คำสั่งใด ฉันรู้ที่อยู่ IP ของเซิร์ฟเวอร์ แต่ฉันไม่ทราบชื่อผู้ใช้
11 shell  samba  file-copy 

3
bash: หลีกเลี่ยงแต่ละบรรทัดจากการสะท้อนที่ "-x"
ในทุบตีเมื่อทำงานกับ-xตัวเลือกมันเป็นไปได้ที่จะได้รับการยกเว้นคำสั่งของแต่ละบุคคลจากการสะท้อน? ฉันพยายามที่จะให้ออกเป็นระเบียบที่เป็นไปได้เพื่อให้ฉันทำงานบางส่วนของสคริปต์ของฉันใน subshell set +xกับ อย่างไรก็ตามแถวset +xนั้นยังคงสะท้อนอยู่และไม่เพิ่มข้อมูลที่มีค่าลงในเอาต์พุต ผมจำได้ว่ากลับมาอยู่ในที่ไม่ดีเก่า.batวันเมื่อทำงานกับสายของแต่ละบุคคลอาจจะได้รับการยกเว้นโดยเริ่มต้นพวกเขาด้วยecho on @มีผู้ใดเทียบเท่าในทุบตี? #!/bin/bash -x function i_know_what_this_does() { ( set +x echo do stuff ) } echo the next-next line still echoes 'set +x', is that avoidable? i_know_what_this_does echo and we are back and echoing is back on เมื่อเรียกใช้ข้างต้นผลลัพธ์คือ: + echo the next-next …
11 bash  shell  debugging 

4
ข้าม 3 ไบต์แรกของไฟล์
ฉันใช้ AIX 6.1 ksh shell ฉันต้องการใช้สายการบินหนึ่งในการทำสิ่งนี้: cat A_FILE | skip-first-3-bytes-of-the-file ฉันต้องการข้าม 3 ไบต์แรกของบรรทัดแรก มีวิธีทำเช่นนี้หรือไม่?

1
วิธีการเปลี่ยนการอนุญาตของไฟล์หลายไฟล์ที่พบด้วยคำสั่ง find?
ฉันมีไดเรกทอรีพร้อมไฟล์จำนวนมาก ส่วนหนึ่งของไฟล์มี755สิทธิ์และส่วนอื่นมี644สิทธิ์ ผมอยากจะแปลงไฟล์ที่มีสิทธิ์ในการ755 644ฉันได้ลองบรรทัดต่อไปนี้โดยใช้มันจากไดเรกทอรีตัวเอง: find . -perm 755 -exec chmod 644 {}\; อย่างไรก็ตามผลที่ได้รับอนุญาตมีการเปลี่ยนแปลงเฉพาะสำหรับไดเรกทอรีตัวเองและหลังจากเปลี่ยนกลับฉันพบว่าสิทธิ์ของไฟล์ยังคงไม่เปลี่ยนแปลง ฉันพลาดอะไรไปหรือเปล่า?

4
เปลี่ยนชื่อไดเรกทอรีย่อยซ้ำ ๆ ที่ตรงกับ regex
Seriesฉันมีเซิร์ฟเวอร์สื่อที่มีโฟลเดอร์ที่เรียกว่า ( /media/Expansion2/Series/) ในนั้นฉันมี (แปลกใจ!) ทีวีซีรีส์ เหล่านี้เป็นเพียงชื่อที่แสดงเช่น/media/Expansion2/Series/The Big Bang Theory/ ภายในโฟลเดอร์ของแต่ละรายการ (และนี่คือปัญหาที่เกิดขึ้น) ฉันมีโฟลเดอร์ซีซัน ขณะนี้ฉันมีการผสมผสานของ 2 อนุสัญญาต่อไปนี้ (รวมถึงอีกสองสามข้อ): /media/Expansion2/Series/The Big Bang Theory/The Big Bang Theory Season 1 /media/Expansion2/Series/The Big Bang Theory/Season 2 Season #ในท้ายที่สุดผมต้องการที่จะเปลี่ยนชื่อโฟลเดอร์ทั้งหมดเพียง เป็น regex ฉันอาจจะพูดอะไรบางอย่างเช่น s/.*(Season \d)/$1 ใช้ได้กับโฟลเดอร์เท่านั้นไม่ใช่ไฟล์ ฉันควรจะพูดถึงว่านี่เป็นโฟลเดอร์ย่อยประมาณ 50+ รายการดังนั้นจึงต้องเริ่มที่/media/Expansion2/Series/ระดับและดูในแต่ละซีรีย์ :)

4
ไวยากรณ์ของเงื่อนไขที่ซับซ้อนในเชลล์คืออะไร
หากต้องการแสดงการทดสอบต่อไปนี้ใน shell (sh): if ( a == 1 && ( b == 1 || b == 2 )) { ... } จนถึงตอนนี้สิ่งที่ดีที่สุดที่ฉันสามารถเขียนได้คือ: if [[ $a -eq 1 ]]; then if [[ $b -eq 1 || $b -eq 2 ]]; then ... fi fi ฉันไม่ทราบวิธีการรวม && และ || ด้วยลำดับความสำคัญที่ถูกต้อง Googling ไม่ได้ให้คำตอบใด …
11 shell 

10
วิธีที่ดีที่สุดในการนับจำนวนไฟล์ในไดเรกทอรีคืออะไร
หากการวิเคราะห์เอาต์พุตlsเป็นอันตรายเพราะสามารถแยกอักขระที่ขี้ขลาด (ช่องว่าง\n, ... ) ออกได้วิธีที่ดีที่สุดที่จะทราบจำนวนไฟล์ในไดเรกทอรีคืออะไร ฉันมักจะพึ่งพาfindเพื่อหลีกเลี่ยงการแยกวิเคราะห์นี้ แต่ในทำนองเดียวกันfind mydir | wc -lจะทำลายด้วยเหตุผลเดียวกัน ตอนนี้ฉันกำลังทำงานกับ Solaris อยู่ แต่ฉันกำลังมองหาคำตอบที่พกพาสะดวกในทุกกรณีและเปลือกหอยที่แตกต่างกันมากที่สุด


1
เหตุใดฉันจึงได้รับข้อผิดพลาด 'ชื่อชนกันระหว่าง ... ' และฉันจะแก้ไขได้อย่างไร
ทุกครั้งที่ฉันพยายามที่จะเปิดตัวvimหรือemacsแม้กระทั่งtop(ฉันคิดว่ามันเป็นจริงคำสั่งใด ๆ ที่ใช้ ncurses) ในเทอร์มินัล unix (บนคอมพิวเตอร์คลัสเตอร์มากกว่า ssh) ฉันจะได้รับข้อผิดพลาด 'ชนชื่อระหว่าง xxx' อย่างต่อเนื่อง Name collision between dumb dumb Name collision between unknown unknown Name collision between lpr lpr Name collision between glasstty glasstty Name collision between vanilla vanilla Name collision between ansi+local1 ansi+local1 Name collision between ansi+local ansi+local ...... Name collision …
11 shell  vim  emacs  gnu-screen 

4
โปรแกรมสร้างไดเรกทอรีระยะไกลโดยใช้ ssh
ใช้เชลล์สคริปต์ฉันจะสร้างไดเรกทอรีระยะไกลจาก serverA -> serverB ด้วย ssh ได้อย่างไร ฉันสามารถส่งคำสั่งสร้างไดเรกทอรีด้วยคำสั่ง ssh ได้หรือไม่ อย่างไร? โดยทั่วไปฉันต้องการสร้างไดเรกทอรีจากระยะไกลตามวันที่ (เช่น 20110304) หากยังไม่มีอยู่
11 shell  ssh  directory 

2
คุณจะสร้าง RPROMPT ใน zsh ได้อย่างไรเมื่ออัพเดททุกครั้ง
ฉันRPROMPTถูกตั้งค่าให้แสดงข้อมูล SVN vcs_infoใช้ RPROMPT=${vcs_info_msg_0_}มันอ่าน เรียกว่าใช้vcs_info precmd()อย่างไรก็ตาม RPROMPT จะไม่อัปเดตเมื่อฉันเปลี่ยนไดเรกทอรี มันทำงานได้ก็ต่อเมื่อฉันเรียกใช้พรอมต์อีกครั้ง (โดยแหล่งที่มา ~ / .zshrc หรือพรอมต์) และจะไม่เปลี่ยนแปลงตาม chdir เว้นแต่ว่าฉันจะเรียกใช้พรอมต์อีกครั้ง มีวิธีใดบ้างที่จะเปลี่ยนพฤติกรรมนี้

2
วิธีการเปลี่ยนไฟล์ในสถานที่โดยใช้ awk? (เช่นเดียวกับ“ sed -i”)
ฉันมีawkสคริปต์new.awk: BEGIN { FS=OFS="," } NR==1 { for (i=1; i<=NF; i++) { f[$i] = i } } NR > 1 { begSecs= mktime(gensub(/[":-]/," ","g",$(f["DateTime"]))) endSecs = begSecs + $(f["TotalDuration"]) $(f["CallEndTime"]) = strftime("%Y-%m-%d %H:%M:%S", endSecs) } { print } ฉันกำลังเรียกสิ่งนี้ในเปลือก awk new.awk sample.csv ... แต่ฉันเห็นการเปลี่ยนแปลงในเครื่อง วิธีการเปลี่ยนแปลงแบบแทนที่ไฟล์เช่นเมื่อใช้sed -i?
11 linux  shell  awk 

1
กระบวนการทดแทนใน GNU Makefiles
ในการพร้อมท์ bash เราสามารถเรียกใช้ diff โดยใช้ไฟล์หลอก: diff <(echo test) <(echo test) การเพิ่มสิ่งนี้ตามที่เป็นลงใน Makefile ล้มเหลว: all: diff <(echo test) <(echo test) ข้อผิดพลาด (คำใบ้: / bin / sh ชี้ไปที่ / bin / bash ในระบบนี้): /bin/sh: -c: line 0: syntax error near unexpected token `(' /bin/sh: -c: line 0: `diff <(echo test) <(echo test)' …

2
เรียกใช้คำสั่งในเชลล์แบบโต้ตอบด้วย ssh หลังจาก sourcing .bashrc
ฉันต้องการที่จะ SSH เข้าไปในคอมพิวเตอร์ Ubuntu ระยะไกลแหล่งที่มาของฉันและเรียกใช้คำสั่งที่ขึ้นอยู่กับพารามิเตอร์ที่กำหนดโดยที่.bashrc .bashrcทั้งหมดที่อยู่ในเชลล์แบบโต้ตอบที่ไม่ปิดหลังจากทำคำสั่งเสร็จแล้ว สิ่งที่ฉันพยายามจนถึงตอนนี้คือ ssh user@remote_computer -t 'bash -l -c "my_alias;bash"' หรือเพียงแค่ ssh user@remote_computer -t "my_alias;bash" ใช้งานได้กับคำสั่งทั่วไป (เช่นlsตัวอย่าง) แต่เมื่อฉันพยายามเรียกใช้นามแฝงที่กำหนดไว้ใน.bashrcฉันได้รับข้อผิดพลาด: bash: my_alias: command not found แต่เมื่อฉันเขียนมันเองอีกครั้งและรันมันก็ใช้งานได้! ดังนั้นฉันจะแน่ใจได้อย่างไรว่า.bashrcมีแหล่งที่มาก่อนที่คำสั่งจะถูกเรียก?
11 bash  shell  ssh  alias 

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