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

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

4
วัตถุประสงค์ของการใช้ shift ในเชลล์สคริปคืออะไร?
ฉันเจอสคริปต์นี้แล้ว: #! /bin/bash if (( $# < 3 )); then echo "$0 old_string new_string file [file...]" exit 0 else ostr="$1"; shift nstr="$1"; shift fi echo "Replacing \"$ostr\" with \"$nstr\"" for file in $@; do if [ -f $file ]; then echo "Working with: $file" eval "sed 's/"$ostr"/"$nstr"/g' $file" > $file.tmp …

7
ส่งผ่านเอาต์พุตของคำสั่งก่อนหน้าไปยังอาร์กิวเมนต์
ฉันคำสั่งที่ส่งออกข้อมูลไปยัง stdout ( command1 -p=aaa -v=bbb -i=4) บรรทัดเอาต์พุตสามารถมีค่าต่อไปนี้: rate (10%) - name: value - 10Kbps ฉันต้องการ grep ผลลัพธ์นั้นเพื่อเก็บ 'rate' (ฉันเดาว่า pipe จะมีประโยชน์ที่นี่) และสุดท้ายฉันต้องการให้อัตรานั้นเป็นค่าของพารามิเตอร์ในคำสั่งที่สอง (สมมุติว่าcommand2 -t=${rate}) ดูเหมือนว่าจะเป็นเรื่องยุ่งยากในด้านของฉัน ฉันต้องการทราบวิธีการใช้ท่อ, grep, sed และอื่น ๆ ที่ดีกว่า ฉันได้ลองชุดค่าผสมจำนวนมากเช่นนั้นมาแล้ว แต่ฉันรู้สึกสับสนกับสิ่งเหล่านี้: $ command1 -p=aaa -v=bbb -i=4 | grep "rate" 2>&1 command2 -t="rate was "${rate}

8
การส่งอาร์กิวเมนต์ที่กำหนดชื่อไปยังสคริปต์ของเชลล์
มีวิธีง่ายๆในการส่งผ่าน (รับ) พารามิเตอร์ชื่อไปยังสคริปต์เชลล์หรือไม่? ตัวอย่างเช่น, my_script -p_out '/some/path' -arg_1 '5' และภายในmy_script.shรับพวกเขาเป็น: # I believe this notation does not work, but is there anything close to it? p_out=$ARGUMENTS['p_out'] arg1=$ARGUMENTS['arg_1'] printf "The Argument p_out is %s" "$p_out" printf "The Argument arg_1 is %s" "$arg1" เป็นไปได้ใน Bash หรือ Zsh?

10
เหตุใด argv จึงรวมชื่อโปรแกรม
โปรแกรม Unix / Linux ทั่วไปยอมรับอินพุตบรรทัดคำสั่งเป็นจำนวนอาร์กิวเมนต์ ( int argc) และเวกเตอร์อาร์กิวเมนต์ ( char *argv[]) องค์ประกอบแรกของargvคือชื่อโปรแกรม - ตามด้วยข้อโต้แย้งที่เกิดขึ้นจริง ทำไมชื่อโปรแกรมที่ส่งผ่านไปยังไฟล์ที่เรียกทำงานได้เป็นอาร์กิวเมนต์? มีตัวอย่างของโปรแกรมที่ใช้ชื่อของตัวเอง (อาจเป็นexecสถานการณ์บางอย่าง) หรือไม่?

8
อะไรคือความแตกต่างระหว่าง $ * และ $ @
พิจารณารหัสต่อไปนี้: foo () { echo $* } bar () { echo $@ } foo 1 2 3 4 bar 1 2 3 4 มันเอาท์พุท: 1 2 3 4 1 2 3 4 ฉันใช้ Ksh88 แต่ฉันสนใจเชลล์ทั่วไปอื่น ๆ ด้วย หากคุณทราบถึงความพิเศษใด ๆ ของเชลล์ที่เฉพาะเจาะจงโปรดอย่าพูดถึงมัน ฉันพบ follwing ในหน้าคน Ksh บน Solaris: ความหมายของ $ * และ …
72 shell  quoting  ksh  arguments 

3
curl ป้องกันรหัสผ่านไม่ให้ปรากฏในเอาต์พุต ps ได้อย่างไร
ฉันสังเกตเห็นเมื่อไม่นานมานี้ว่าชื่อผู้ใช้และรหัสผ่านที่กำหนดให้curlเป็นอาร์กิวเมนต์บรรทัดคำสั่งไม่ปรากฏในpsผลลัพธ์ (แม้ว่าแน่นอนว่าพวกเขาอาจปรากฏในประวัติทุบตีของคุณ) /proc/PID/cmdlineเขาก็จะไม่ปรากฏใน (ความยาวของอาร์กิวเมนต์ชื่อผู้ใช้ / รหัสผ่านรวมกันสามารถได้รับแม้ว่า) การสาธิตด้านล่าง: [root@localhost ~]# nc -l 80 & [1] 3342 [root@localhost ~]# curl -u iamsam:samiam localhost & [2] 3343 [root@localhost ~]# GET / HTTP/1.1 Authorization: Basic aWFtc2FtOnNhbWlhbQ== User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.15.3 zlib/1.2.3 libidn/1.18 libssh2/1.4.2 Host: localhost Accept: */* [1]+ Stopped nc -l 80 [root@localhost …

8
การแก้“ mv: รายการอาร์กิวเมนต์ยาวเกินไป” หรือไม่
ฉันมีโฟลเดอร์ที่มีไฟล์มากกว่าล้านไฟล์ที่ต้องการเรียงลำดับ แต่ฉันไม่สามารถทำอะไรได้เลยเพราะmvแสดงข้อความนี้ตลอดเวลา -bash: /bin/mv: Argument list too long ฉันใช้คำสั่งนี้เพื่อย้ายไฟล์ส่วนขยายที่น้อยกว่า: mv -- !(*.jpg|*.png|*.bmp) targetdir/
64 bash  shell  arguments  mv 

9
ฉันจะสะท้อนเอาต์พุต 1 คอลัมน์จากคำสั่ง ls ได้อย่างไร
ให้พูดเมื่อฉันทำคำสั่ง ls ผลลัพธ์คือ: file1 file2 file3 file4 เป็นไปได้หรือไม่ที่จะแสดงเฉพาะคอลัมน์ของเอาต์พุตในกรณีนี้ file2? ฉันได้ลองทำสิ่งต่อไปนี้โดยไม่ประสบความสำเร็จ: echo ls | $2 โดยพื้นฐานทั้งหมดที่ฉันต้องการทำคือ echo เฉพาะคอลัมน์ที่สองในกรณีนี้ฉันต้องการ echo: file2
54 bash  ls  parameter  arguments 

1
เมื่อใดและอย่างไร double-dash (-) ถูกนำมาใช้เป็นจุดสิ้นสุดของตัวเลือกตัวคั่นใน Unix / Linux
ฉันไม่คิดว่าเปลือก / สาธารณูปโภคในประวัติศาสตร์ Unix หรือในสิ่งที่เป็น "ล่าสุด" เป็น4.4BSDสนับสนุนการใช้สองเส้นประ (หรือสองยัติภังค์ติดต่อกัน) ในฐานะที่เป็นส่วนท้ายของตัวเลือกตัวคั่น ด้วยFreeBSDคุณสามารถดูตัวอย่างข้อความที่แนะนำในrm manpagesด้วย2.2.1 รีลีส (1997) แต่นี่เป็นเพียงเอกสารประกอบสำหรับคำสั่งเดียว ดูGNU fileutils changelog ที่เก่าแก่ที่สุดที่ฉันสามารถหาได้ฉันเห็นสิ่งนี้1 (เปลี่ยนแปลงเล็กน้อย): Tue Aug 28 18:05:24 1990 David J. MacKenzie (djm at albert.ai.mit.edu) * touch.c (main): Don't interpret first non-option arg as a <--- time if `--' is given (POSIX-required kludge). * touch.c: …
49 history  posix  gnu  arguments 

5
รายการอาร์กิวเมนต์ยาวเกินไปสำหรับ ls
ฉันได้รับข้อผิดพลาดต่อไปนี้เมื่อพยายามls *.txt | wc -lไดเรกทอรีที่มีไฟล์จำนวนมาก: -bash: /bin/ls: Argument list too long เกณฑ์ของ "รายการอาร์กิวเมนต์" นี้ขึ้นอยู่กับ distro หรือข้อมูลจำเพาะของคอมพิวเตอร์หรือไม่ โดยปกติแล้วฉันจะส่งผลให้เกิดผลลัพธ์ที่ยิ่งใหญ่เช่นคำสั่งอื่น ๆ ( wc -lตัวอย่าง) ดังนั้นฉันจึงไม่กังวลกับข้อ จำกัด ของเทอร์มินัล
48 ls  arguments 

3
กำหนดขนาดสูงสุดสำหรับอาร์กิวเมนต์คำสั่งเดียวคืออะไร
ARG_MAXฉันถูกภายใต้การแสดงผลที่ความยาวสูงสุดของอาร์กิวเมนต์เดียวไม่ได้เป็นปัญหาที่นี่ให้มากที่สุดเท่าขนาดรวมของอาร์กิวเมนต์อาร์เรย์โดยรวมขนาดบวกของสภาพแวดล้อมซึ่งจะถูก จำกัด ดังนั้นฉันคิดว่าบางสิ่งเช่นนี้จะประสบความสำเร็จ: env_size=$(cat /proc/$$/environ | wc -c) (( arg_size = $(getconf ARG_MAX) - $env_size - 100 )) /bin/echo $(tr -dc [:alnum:] </dev/urandom | head -c $arg_size) >/dev/null ด้วยความ- 100ที่เกินพอที่จะอธิบายความแตกต่างระหว่างขนาดของสภาพแวดล้อมในเชลล์และechoกระบวนการ แต่ฉันได้รับข้อผิดพลาด: bash: /bin/echo: Argument list too long หลังจากเล่นไปซักพักผมก็พบว่าค่าสูงสุดนั้นเป็นลำดับเลขฐานสิบหกที่เล็กกว่า: /bin/echo \ $(tr -dc [:alnum:] </dev/urandom | head -c $(($(getconf ARG_MAX)/16-1))) \ …
47 kernel  echo  arguments 

7
ใช้ `` 'กับซีดีเท่านั้นหรือไม่
cd - สามารถสลับระหว่าง dir ปัจจุบันและ dir ก่อนหน้า มันดูเหมือนว่าผมเคยเห็น-มาใช้เป็นข้อโต้แย้งคำสั่งอื่น ๆ ก่อน แต่ผมจำไม่ได้ว่าถ้าวิธีการเช่นเดียวกับกับ-cd ฉันพบว่าไม่ได้ทำงานกับ-ls คือ- ใช้เฉพาะกับ cd?

7
มีการโต้แย้งหลายครั้งใน shebang
ฉันสงสัยว่ามีวิธีทั่วไปในการส่งตัวเลือกหลายตัวไปยังโปรแกรมที่เรียกใช้งานได้ผ่านทางสาย shebang ( #!) ผมใช้ NixOS และส่วนแรกของ shebang ในสคริปต์ใด ๆ /usr/bin/envที่ฉันเขียนมักจะ ปัญหาที่ฉันพบคือทุกสิ่งที่เกิดขึ้นหลังจากนั้นถูกตีความว่าเป็นไฟล์หรือไดเรกทอรีเดียวโดยระบบ ตัวอย่างเช่นสมมติว่าฉันต้องการเขียนสคริปต์ที่จะดำเนินการโดยbashในโหมด posix วิธีที่ไร้เดียงสาของการเขียน Shebang จะเป็น: #!/usr/bin/env bash --posix แต่พยายามที่จะรันสคริปต์ผลลัพธ์จะสร้างข้อผิดพลาดต่อไปนี้: /usr/bin/env: ‘bash --posix’: No such file or directory ฉันทราบเกี่ยวกับโพสต์นี้แต่ฉันสงสัยว่ามีวิธีการทั่วไปที่สะอาดกว่าหรือไม่ แก้ไข : ฉันรู้ว่าสำหรับสคริปต์Guileมีวิธีการบรรลุสิ่งที่ฉันต้องการบันทึกไว้ในส่วน 4.3.4ของคู่มือ: #!/usr/bin/env sh exec guile -l fact -e '(@ (fac) main)' -s "$0" "$@" !# เคล็ดลับที่นี่ก็คือบรรทัดที่สอง (เริ่มต้นด้วยexec) …

3
ฉันจะโยง pgrep กับ kill ได้ไหม
ฉันสังเกตเห็นว่า|ใช้เพื่อส่งผลลัพธ์ของคำสั่งแรกไปยังอีก ฉันต้องการฆ่ากระบวนการทั้งหมดที่ตรงกับชื่อ นี่คือสิ่งที่ pgrep ทำตามปกติ: $ pgrep name 5089 5105 และข้อโต้แย้งหลายประการดูเหมือนจะทำงานกับkill: sudo kill 5089 5105 แต่นี่เป็นสิ่งที่ผิด: pgrep name | kill ดังนั้นจะทำอย่างไรให้ถูกต้อง?
31 shell  pipe  arguments 

2
เมื่อใดที่ฉันต้องระบุ add_efi_memmap เป็นอาร์กิวเมนต์เคอร์เนลในการบูต UEFI / EFI
ฉันอ่านบทเรียนบางส่วนเกี่ยวกับวิธีการ EFI stub (efistub) โหลดเคอร์เนลลินุกซ์ add_efi_memmapคำแนะนำเหล่านี้มักจะใช้เคอร์เนลบูตพารามิเตอร์ ฮาร์ดแวร์ที่ต้องการคือ Intel x64 มี RAM 8GB การตั้งค่าปัจจุบันของฉันกำลังใช้grub-efibootloader และเคอร์เนล v3.13 ด้วงบูตโดยไม่ต้องadd_efi_memmapอาร์กิวเมนต์บูต: 23เส้น BIOS-e820 นับด้วยdmesg | grep BIOS-e820: | wc -l 243เส้นหน่วยความจำ EFI นับด้วยdmesg | grep efi:\ mem | wc -l เขต DMA: 24หน้าที่สงวนไว้ หน่วยความจำ: 7840568K / 8283384K ใช้ได้ ลิขสิทธิ์ 442816K การบูตด้วย GRUBadd_efi_memmapและขนาดแผนที่หน่วยความจำ EFI นั้นแตกต่างกัน: 23 …

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