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

คำถามเฉพาะของ Bourne อีกครั้งของเชลล์ใน GNU เมื่อเทียบกับเชลล์ Bourne / POSIX อื่น ๆ สำหรับคำถามเกี่ยวกับเชลล์ Unix โดยทั่วไปให้ใช้ / เชลล์แท็กแทน

5
ฉันขอเกี่ยวกับคำสั่ง cd ได้หรือไม่
ฉันพยายามตั้งค่าบางอย่างบนเซิร์ฟเวอร์ที่ฉันเรียกใช้เมื่อฉันcdเข้าไปในpublic_htmlโฟลเดอร์ 95% ของเวลามีคำสั่งเล็กน้อยที่ฉันจะเรียกใช้เพื่อตรวจสอบบางสิ่งอยู่เสมอ มีอยู่แล้วฉันสามารถขอเป็นcdดังนั้นถ้าไดเรกทอรีเป็นpublic_htmlมันจะทำงานโดยอัตโนมัติคำสั่งสำหรับฉัน หากฉันไม่สามารถขอcdคำสั่งได้มีสิ่งอื่นอีกไหมที่ฉันสามารถทำได้เพื่อให้ได้ผลลัพธ์ตามที่ฉันต้องการ ฉันใช้ CentOS 5.8

2
Piping string manipulation
ฉันได้อ่านคำถามเกี่ยวกับการจัดการสตริงทุบตี bash อื่น ๆ แต่ดูเหมือนจะเป็นแอปพลิเคชันพิเศษ เป็นหลักมีวิธีการทำด้านล่างง่ายขึ้น? แทน $ string='hello world'; string2="${string// /_}"; echo "${string2^^}" HELLO_WORLD สิ่งที่ต้องการ $ echo 'hello world' | $"{-// /_}" | "${ -^^}" HELLO_WORLD แก้ไขฉันสนใจที่จะอยู่ในการควบคุมของ bash หากเป็นไปได้เพื่อรักษาความเร็ว (ตรงข้ามกับ sed / awk ซึ่งมีแนวโน้มที่จะทำให้สคริปต์ของฉันช้าลงอย่างมาก) แก้ไข 2: @jimmij ฉันชอบตัวอย่างที่สองและทำให้ฉันทำฟังก์ชั่น bash_m() { { read x; echo "${x// /_}"; } | { …

2
ลำดับความสำคัญของ && vs & ใน bash และ zsh
ตอบคำถามนี้ฉันค้นพบความแตกต่างที่ตลกมาก (และบอบบาง) ระหว่างพฤติกรรมในbashและzsh: ในbash: romano@RRyS:~$ pwd /home/romano romano@RRyS:~$ alias x="cd /bin && ./echo A >/dev/null &" romano@RRyS:~$ x [1] 16611 romano@RRyS:~$ pwd /home/romano อย่างที่คุณเห็นการดำเนินการของนามแฝงxจะดำเนินการใน subshell ดังนั้นไดเรกทอรีปัจจุบันจะไม่เปลี่ยนแปลง ไม่อยู่ในzsh: [romano:~] % pwd /home/romano [romano:~] % alias x="cd /bin && ./echo A >/dev/null &" [romano:~] % x [1] 16744 [1] + 16744 done …
9 bash  shell  zsh 

2
ทดสอบเสียงสะท้อน stty -echo -> stty: อินพุตมาตรฐาน: ioctl ที่ไม่เหมาะสมสำหรับอุปกรณ์
ฉันกำลังเล่นกับสคริปต์ perl ที่จะนำผู้ใช้ป้อนด้วยต่อไปนี้: system( qw( stty -echo ) ); $? == 0 or die "Error unable to disable character printing.\n"; print "$prompt: "; my $input = <STDIN>; ฉันคิดว่าฉันจะสามารถตอบสนองโดยใช้ echo ได้ แต่ดูเหมือนว่าจะขัดแย้งกับคำสั่ง stty -echo และสร้างข้อผิดพลาดต่อไปนี้: stty: standard input: Inappropriate ioctl for device โดยไม่ต้องเปลี่ยนสคริปต์ perl สิ่งที่สามารถทำได้ใน bash ที่จะผ่านในการป้อนข้อมูลหรือไม่ ทำให้เกิดปัญหาอะไร
9 bash  perl  stty 

1
ทำไมทุบตีถึงทำให้แจง / เรียกใช้เนื้อหาในตัวแปรสภาพแวดล้อม
ShellShockข้อผิดพลาดในการทำงานทุบตีโดยวิธีการของตัวแปรสภาพแวดล้อม สุจริตฉันประหลาดใจด้วยความจริงที่ว่ามีคุณสมบัติเช่น: "การส่งผ่านนิยามฟังก์ชันผ่าน env vars" ดังนั้นคำถามนี้ในขณะที่อาจไม่ได้กำหนดอย่างสมบูรณ์คือการขอตัวอย่างหรือกรณีที่จำเป็นต้องมีคุณสมบัตินี้? โบนัส. เชลล์อื่น ๆ zsh, dash ฯลฯ มีคุณสมบัตินี้ด้วยหรือไม่?

2
ทำไมความสามารถในการกำหนดฟังก์ชั่นในตัวแปรด้านสิ่งแวดล้อมจึงไม่ใช่ความเสี่ยงด้านความปลอดภัยในตัวเอง?
ตามที่ฉันเข้าใจโดยทั่วไปถือว่าปลอดภัยที่จะให้ทุกคนให้ข้อมูลที่จะถูกเก็บไว้ในตัวแปรด้านสิ่งแวดล้อม ช่องโหว่ shellshock เป็นปัญหาที่นี่เพราะมันหมายความว่าโค้ดท้ายคำนิยามฟังก์ชั่นภายในตัวแปรสภาพแวดล้อมจะถูกดำเนินการเมื่ออินสแตนซ์ใหม่ของ bash เปิดตัวและคุณไม่ต้องการให้ใครเรียกใช้รหัสใด ๆ บนเซิร์ฟเวอร์ของคุณ . เห็นได้ชัดว่านิยามของฟังก์ชันเองนั้นไม่ใช่ความเสี่ยงด้านความปลอดภัยและได้รับอนุญาตเพราะจะต้องมีการเรียกใช้อย่างชัดเจนเพื่อให้โค้ดทำงาน คำถามของฉันคือทำไมผู้ใช้lsที่ไม่ประสงค์ดีไม่สามารถกำหนดฟังก์ชั่นโดยมีรหัสที่เป็นอันตรายเช่นเดียวกับคำสั่งทั่วไปแล้วหวังว่าสคริปต์ (หรือสิ่งที่กำลังเรียกใช้) จะใช้คำสั่งนี้ในบางจุด? ตัวอย่างของสิ่งที่ฉันมีอยู่ในใจ: $ export ls='() { echo "doing bad things..."; }' $ bash -c ls doing bad things...

4
วางงานในพื้นหลังโดยไม่หยุด
สมมติว่าคุณเริ่มงานเช่นนี้ foo และจากนั้นความปรารถนาที่คุณต้องการวางไว้ในพื้นหลัง พิมพ์ดีดCtrl+ Zแล้วbgไม่หลอกลวง แต่จะหยุดfooระหว่างCtrl+ และZ bgฉันจะวาง foo ไว้ในพื้นหลังโดยไม่หยุดก่อนได้อย่างไร
9 bash 

2
มีวิธียกเลิกการแก้ไขประวัติทุบตีหรือไม่?
เมื่อกดขึ้นฉันสามารถทำตามคำสั่งที่ป้อนไว้ก่อนหน้านี้ได้ ฉันสังเกตว่าถ้าฉันปรับเปลี่ยนหนึ่งในนั้นจะเปลี่ยนแปลงประวัติศาสตร์ ตัวอย่างเช่นถ้าฉันพิมพ์: echo a echo b echo c [up][up][backspace]d[ctrl+c] ประวัติความเป็นมาในขณะนี้แสดงให้เห็นว่าคำสั่งที่สองคือไม่echo d echo bฉันจะเก็บแรกecho bในประวัติศาสตร์ได้อย่างไร ตัวอย่างเช่นสมมติว่าฉันรันคำสั่งที่ยาวมากพร้อมด้วยตัวเลือกมากมาย จากนั้นฉันต้องการเรียกใช้อีกครั้งโดยมีการเปลี่ยนแปลงเล็กน้อยดังนั้นฉันจึงย้อนกลับไปในประวัติศาสตร์เพื่อค้นหาทำการเปลี่ยนแปลง แต่แล้วตระหนักว่าจริง ๆ แล้วฉันไม่จำเป็นต้องเรียกใช้อีกครั้งโดยคิดถึงตัวเลือกอื่น ทำแทน หลังจากนั้นฉันต้องการกลับไปและเตือนตัวเองว่าคำสั่งที่ฉันใช้คืออะไร - แต่เดี๋ยวก่อนประวัติศาสตร์กำลังแสดงสิ่งที่ผิด! สิ่งนี้เกิดขึ้นน้อยมาก แต่เมื่อไหร่ที่ฉันพบว่ามันน่ารำคาญจริงๆ มีวิธีการเก็บประวัติดั้งเดิมโดยอัตโนมัติหรือไม่?

3
ตัดความกว้างบรรทัด stdout แบบไดนามิกใน Bash
เมื่อเร็ว ๆ นี้ฉันได้ทดลองกับpsคำสั่งและบางครั้งเส้นทางที่ยาวพันไปยังบรรทัดถัดไป (หรือสอง) และทำให้อ่านยาก ฉันต้องการไพพ์psเอาต์พุตในโปรแกรมอื่นเพื่อ จำกัด เอาต์พุตเป็นxจำนวนอักขระ นี่คือสิ่งที่ฉันมีจนถึงตอนนี้ แต่มันใช้งานไม่ได้: ps aux | cut -c1-$(stty size | cut -d' ' -f2) $(stty size | cut -d' ' -f2)ประเมินถึง 167 cutแต่ไม่ได้ดูเหมือนจะมีการป้อนข้อมูลที่ถูกต้องสำหรับ มีวิธีรับไวยากรณ์ประเภทนี้ทำงานในทุบตี?
9 bash  shell  stdout  cut 

1
เหตุผลสำหรับเปลือกทุบตีไม่เตือนคุณเกี่ยวกับการคำนวณทางคณิตศาสตร์ล้น ฯลฯ คืออะไร?
มีขีด จำกัด สำหรับความสามารถในการประเมินผลทางคณิตศาสตร์ของbashเชลล์ คู่มือฉบับย่อเกี่ยวกับแง่มุมของเชลล์ทางคณิตศาสตร์นี้ แต่ระบุว่า : การประเมินจะทำในจำนวนเต็มที่มีความกว้างคงที่โดยไม่มีการตรวจสอบการล้น แต่การหารด้วย 0 จะถูกดักและตั้งค่าสถานะเป็นข้อผิดพลาด โอเปอเรเตอร์และลำดับความสำคัญการเชื่อมโยงและค่าต่าง ๆ นั้นเหมือนกับในภาษา C จำนวนเต็มที่มีความกว้างคงที่ซึ่งหมายถึงนี้เป็นจริงเกี่ยวกับชนิดข้อมูลที่ใช้ (และเฉพาะของสาเหตุนี้เกินกว่านี้) แต่ค่าขีด จำกัด จะแสดง/usr/include/limits.hในแบบนี้: # if __WORDSIZE == 64 # define ULONG_MAX 18446744073709551615UL # ifdef __USE_ISOC99 # define LLONG_MAX 9223372036854775807LL # define ULLONG_MAX 18446744073709551615ULL และเมื่อคุณรู้ว่าคุณสามารถยืนยันสถานะของความจริงเช่นนี้: # getconf -a | grep 'long' LONG_BIT 64 ULONG_MAX 18446744073709551615 …

2
เชื่อมต่อไฟล์วิดีโอแบบโต้ตอบ
วิธีการต่อเชื่อม (เข้าร่วม) ไฟล์วิดีโอ MP4 หลายไฟล์เป็นไฟล์เดียว มีโปรแกรมมากมายที่ทำเช่นนี้สำหรับสองไฟล์จากบรรทัดคำสั่ง ตัวอย่างเช่น ffmpeg avconv mp4box แต่บ่อยครั้งที่เราต้องการวิธีแก้ปัญหาในการทำสิ่งนี้แบบโต้ตอบ

2
ฆ่าโพรเซสถ้ามันเงียบไปชั่วระยะเวลาหนึ่ง
ฉันมียูทิลิตี้ที่มีนิสัยที่น่ารังเกียจที่จะเงียบและอยู่ที่นั่นฉันรู้แล้วว่ามันใช้เวลานานแค่ไหนในการทำสิ่งนี้ดังนั้นฉันจึงใช้timeoutเพื่อต่อสู้กับสิ่งนี้ แต่บางครั้งมันก็ทำก่อนเวลานั้น มีเครื่องมือที่คล้ายกับtimeoutที่จะฆ่ากระบวนการถ้ามันหยุดกำกับการส่งออกไปยัง stdout?
9 linux  bash  shell  stdout  timeout 

2
“ ประวัติ” หยุดทำงานเมื่อทำงานในสคริปต์ทุบตี
ฉันกำลังเขียนสคริปต์ง่ายๆเพื่อ grep ประวัติทุบตีของฉันเพื่อค้นหาสายเฉพาะ บนบรรทัดคำสั่งฉันสามารถทำสิ่งต่อไปนี้ซึ่งทำงานได้ดี: history | grep git อย่างไรก็ตามเมื่อฉันสร้างสคริปต์ทุบตีด้วยคำสั่งเดียวกับข้างบนก็historyไม่ส่งคืนสิ่งใดเลย: #!/bin/bash history | grep git เมื่อฉันลบบรรทัดแรก#!/bin/bashสคริปต์ของฉันจะทำงานอีกครั้ง เกิดอะไรขึ้นที่นี่ ฉันจะใช้historyภายในสคริปต์ทุบตีได้อย่างไร

1
colorize bash_completion
เมื่อฉันพิมพ์grepแล้วกดTABสองครั้งbash_completionจะแสดงรายการไฟล์และไดเรกทอรีในไดเรกทอรีปัจจุบัน มันจะเติมชื่อไฟล์ให้สมบูรณ์เมื่อฉันพิมพ์อักษรตัวแรก นั่นคือทั้งหมดที่ดีมากปัญหาเดียวคือเมื่อไดเรกทอรีที่มีไฟล์และไดเรกทอรีย่อยจำนวนมากก็สามารถวุ่นวายและไม่เป็นระเบียบ มันจะช่วยได้มากหากbash_completionอย่างน้อยไดเรกทอรีสีอาจแตกต่างกันคล้ายกับสิ่งที่ls -lAทำ เป็นไปได้ไหม แก้ไข: นี่คือรูปตัวอย่างbash_completionไฟล์ปรับแต่งของฉัน: if [[ ${cur} == -* ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) return 0 else _filedir fi
9 bash  colors 

1
ls -l - กลุ่มไดเรกทอรีแรก (ดำเนินการกับ symlink ด้วย)
lsตัวเลือก--group-directories-firstทำให้ไดเรกทอรีที่จะแสดงรายการอยู่ด้านบนซึ่งทำให้การส่งออกของlsดีและสะอาด: ls -l --group-directories-first อย่างไรก็ตามมันไม่ได้ดำเนินการกับsymlinksซึ่งเป็นsymlinksไดเรกทอรีจริงๆ มีความเป็นไปได้ที่จะใช้เป็น ls -l -L --group-directories-first ซึ่งจะแสดงรายการทั้งสองประเภทของไดเรกทอรีที่ด้านบน แต่จะไม่แยกความแตกต่างระหว่างไดเรกทอรีที่เหมาะสมและไดเรกทอรี symlinked ซึ่งทำให้เกิดความสับสนอีกครั้ง สามารถlsแสดงไดเรกทอรี symlinked ด้านบนในขณะที่ยังคงแตกต่างจากไดเรกทอรีปกติได้หรือไม่ แก้ไข:bashฉันใช้
9 bash  zsh  directory  ls  symlink 

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