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

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

5
สคริปต์ทุบตี [x $ 1 = x]
ฉันกำลังอ่านสคริปต์ทุบตีฉันไม่เข้าใจว่าเกิดอะไรขึ้น #!/bin/sh [ x$1 = x ] เกิดอะไรขึ้นกับบรรทัดที่สองและ[ x$1 = x ] หมายถึงอะไร
21 bash  shell 

4
ตรวจจับโดยอัตโนมัติเมื่อฉันพิมพ์“ vi” แต่หมายถึง“ cd”?
ประมาณ 5 ครั้งต่อวันฉันพิมพ์ "vi" เมื่อฉันหมายถึง "cd" และท้ายที่สุดเปิดไดเรกทอรีใน vi มันทำให้ฉันถั่ว ดูเหมือนว่าควรมีวิธีการตรวจสอบเมื่อฉันพิมพ์ใน "vi + directory" และเปลี่ยนเป็น "cd + directory" โดยอัตโนมัติ คิด?
21 bash  shell  alias  cd-command 

2
จะรักษาระบบที่ไม่เชื่อเรื่องพระเจ้าได้อย่างไร?
เนื่องจากการทำงานฉันเพิ่งเริ่มใช้ OS X และได้ตั้งค่าโดยใช้ homebrew เพื่อรับประสบการณ์คล้ายกับ Linux อย่างไรก็ตามมีความแตกต่างเล็กน้อยในการตั้งค่าของพวกเขา บางระบบต้องอยู่ในระบบเดียวเท่านั้น เมื่อ dotfiles ของฉันอยู่ในพื้นที่เก็บข้อมูลคอมไพล์ฉันสงสัยว่าสวิตช์ชนิดใดที่ฉันสามารถตั้งค่าได้ดังนั้นการกำหนดค่าบางอย่างจะอ่านเฉพาะระบบ Linux และอื่น ๆ สำหรับ OS X ในฐานะที่เป็น dotfiles ผมหมายในหมู่อื่น ๆ เพื่อหรือ.bash_profiles.bash_alias

4
ฉันเปลี่ยนชื่อโฮสต์ทำไมข้อความแจ้งเตือนทุบตี PS1 ของฉันไม่เปลี่ยนแปลง
ฉันเปลี่ยนชื่อโฮสต์โดยแก้ไข / etc / hostname และสามารถดูชื่อโฮสต์ใหม่โดยใช้คำสั่งhostnameและhostname -F แต่เชลล์พรอมต์ยังคงแสดงชื่อโฮสต์เก่าอยู่ นี่คือ Ubuntu 11.0.4 โดยวิธีการ พรอมต์ตั้งอยู่ในของฉัน.bashrcซึ่งฉันไม่ได้แก้ไข ออกจากระบบและแม้กระทั่งการรีบูตไม่มีผล ส่วนที่เกี่ยวข้องของ Ubuntu มาตรฐาน.bashrc: if [ "$color_prompt" = yes ]; then PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ' else PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ ' fi ($ debian_chroot ไม่ได้ตั้งค่าในขณะที่ฉันเข้าสู่ระบบ ... ) ฉันเดาว่าชื่อโฮสต์ถูกเลือกโดยตัวละครพิเศษ \ h นี่คือการตั้งค่า PS1 ตามที่รายงานในเชลล์: PS1='\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$ ' และนี่คือสิ่งที่ PS1 แสดง: username@oldhostname:~$ ฉันทำขั้นตอนซ้ำโดยใช้คำสั่งที่แน่นอนในคำตอบของ Warren …
21 bash  ubuntu  hostname 

2
แสดงเนื้อหาด้านล่างของพรอมต์ที่ shell prompt หรือไม่
ช่วยบอกว่าพรอมต์ของฉันเป็นแบบนี้ (_ แทนเคอร์เซอร์ของฉัน) ~ % _ มีวิธีใดที่ฉันจะทำให้มันเป็นแบบนี้ ~ % _ [some status] คำถามเดิมเกี่ยวกับ zsh แต่ตอนนี้มีคำตอบอื่น ๆ
21 bash  zsh  prompt 

3
ฉันจะค้นหาหมายเลขบรรทัดใน Bash เมื่อเกิดข้อผิดพลาดได้อย่างไร
คุณจะค้นหาหมายเลขบรรทัดใน Bash ที่เกิดข้อผิดพลาดได้อย่างไร ตัวอย่าง ฉันสร้างสคริปต์ง่าย ๆ ต่อไปนี้พร้อมหมายเลขบรรทัดเพื่ออธิบายสิ่งที่เราต้องการ สคริปต์จะคัดลอกไฟล์จาก cp $file1 $file2 cp $file3 $file4 เมื่อหนึ่งในcpคำสั่งล้มเหลวแล้วฟังก์ชั่นจะออกกับทางออกที่ 1 เราต้องการเพิ่มความสามารถให้กับฟังก์ชันเพื่อพิมพ์ข้อผิดพลาดด้วยหมายเลขบรรทัด (ตัวอย่างเช่น 8 หรือ 12) เป็นไปได้ไหม สคริปต์ตัวอย่าง 1 #!/bin/bash 2 3 4 function in_case_fail { 5 [[ $1 -ne 0 ]] && echo "fail on $2" && exit 1 6 } 7 8 cp …

7
แนวคิด "การโทรกลับ" ของการเขียนโปรแกรมมีอยู่ใน Bash หรือไม่
สองสามครั้งเมื่อฉันอ่านเกี่ยวกับการเขียนโปรแกรมฉันพบแนวคิด "การโทรกลับ" สนุกฉันไม่เคยพบคำอธิบายที่ฉันสามารถเรียกว่า "การสอน" หรือ "ชัดเจน" สำหรับคำนี้ "ฟังก์ชั่นการโทรกลับ" (คำอธิบายเกือบทั้งหมดที่ฉันอ่านดูเหมือนว่าฉันแตกต่างจากที่อื่นมากพอและฉันรู้สึกสับสน) แนวคิด "การโทรกลับ" ของการเขียนโปรแกรมมีอยู่ใน Bash หรือไม่ ถ้าเป็นเช่นนั้นโปรดตอบด้วยตัวอย่างง่ายๆแบบ Bash
21 bash  function 

3
ฉันจะขยายตัวแปรที่ยกมาเป็นอะไรถ้ามันว่างเปล่า?
ว่าฉันมีสคริปต์ทำ: some-command "$var1" "$var2" ... และในกรณีที่var1ว่างเปล่าฉันอยากจะแทนที่ด้วยไม่มีอะไรแทนที่สตริงว่างดังนั้นคำสั่งที่ดำเนินการคือ: some-command "$var2" ... และไม่: some-command '' "$var2" ... มีวิธีที่ง่ายกว่าการทดสอบตัวแปรและเงื่อนไขรวมถึงมันได้หรือไม่ if [ -n "$1" ]; then some-command "$var1" "$var2" ... # or some variant using arrays to build the command # args+=("$var1") else some-command "$var2" ... fi มีการทดแทนพารามิเตอร์มากกว่าที่สามารถขยายไปเป็นอะไรใน bash, zsh หรือไม่ชอบ? ฉันอาจยังต้องการใช้ globbing ในส่วนที่เหลือของข้อโต้แย้งดังนั้นการปิดการใช้งานและการเลิกตัวแปรไม่ได้เป็นตัวเลือก

4
นามแฝงในแผ่นซีดีในไดเรกทอรีและเรียกคำสั่ง
ฉันมี.bash_profileและในที่ฉันมีชุดของนามแฝง นามแฝงเหล่านั้นในขณะนี้ดำเนินการเพียงคำสั่งเดียวและมันค่อนข้างง่าย อย่างไรก็ตามฉันต้องการทำสองสิ่งด้วยนามแฝงใหม่ที่ฉันพยายามสร้าง ซีดีลงในไดเรกทอรี เรียกใช้คำสั่งจากไดเรกทอรีนั้น
21 bash  alias  cd-command 

5
วิธีจับคู่ * กับไฟล์ที่ซ่อนอยู่ในไดเรกทอรี
วิธีจับคู่ไฟล์ที่ซ่อนอยู่ในไดเรกทอรีที่กำหนด ตัวอย่างเช่น ถ้าฉันให้คำสั่งด้านล่างมันไม่ได้ให้ผลลัพธ์ของไฟล์ที่ซ่อนอยู่ du -b maybehere*/* วิธีการทำให้ง่าย ๆ นี้โดยใช้คำสั่งเดียวแทนที่จะใช้ du -b maybehere*/.* maybehere*/* เพราะฉันต้องพิมพ์บางทีสองครั้ง

3
รับตัวบ่งชี้ความคืบหน้าเมื่อนำเข้าฐานข้อมูล MySQL
ฉันมักจะนำเข้าฐานข้อมูล MySQL และอาจใช้เวลาสักครู่ ไม่มีตัวบ่งชี้ความคืบหน้าใด ๆ สามารถแสดงได้อย่างใดอย่างหนึ่ง? อาจมีการนำเข้าระเบียน, นำเข้า MB หรือนำเข้าตาราง ... สิ่งใดจะดีไปกว่าการรอ ใครมีความคิด? ฉันใช้คำสั่งนี้: mysql -uuser -p -hhost database < largefile.sql ไฟล์อยู่ระหว่าง 40-300 MB และโฮสต์อยู่ในเครือข่ายท้องถิ่น
21 bash  mysql 

4
'IFS' คืออะไร
ฉันอ่านกระทู้นี้: วิธีการวนรอบไฟล์? คือIFSอะไร และการใช้งานในบริบทของ - forลูปคืออะไร?
21 bash  shell 

2
วิธีการใช้ข้อเสนอแนะการติดตั้งแพคเกจใน Debian?
ฉันสังเกตเห็นว่าในขณะที่บน Ubuntu ถ้าฉันพิมพ์ต่อไปนี้: mc และมันไม่ได้ติดตั้งฉันได้รับข้อความด้านล่าง: The program 'mc' is currently not installed. You can install it by typing: sudo apt-get install mc อย่างไรก็ตามใน Debian นั้นไม่สามารถใช้ได้ มันเพิ่งให้ข้อความ "-bash: / usr / bin / mc: ไม่มีข้อความไฟล์หรือไดเรกทอรี" ฉันจะใช้ฟังก์ชันการทำงานเดียวกันในบรรทัดคำสั่ง bash บน Debian ได้อย่างไร ใช่ฉันรู้ว่าถ้ามันเป็นข้อเสนอแนะของแพคเกจที่ฉันต้องการฉันก็สามารถค้นหา regex ใช้ค้นหา apt-แคช อย่างไรก็ตามฉันหวังว่าจะได้คำแนะนำที่ง่ายขึ้นทันทีเมื่อพิมพ์ชื่อของโปรแกรม เป็นต่อการอภิปรายการทำงานให้บริการโดยแพคเกจคำสั่งที่ไม่พบ อย่างไรก็ตามแม้หลังจากติดตั้งแล้วและยังติดตั้งแพคเกจ bash-completion ก็ไม่สามารถใช้งานได้บน Debian bash …

3
วิธีที่ปลอดภัยในการส่งรหัสผ่านสำหรับ> 1 โปรแกรมใน bash
ฉันเขียนสคริปต์และจำเป็นที่จะต้องขอให้ผู้ใช้รหัสผ่านของเขาและผ่านไปbash opensslในขณะที่opensslสามารถอ่านรหัสผ่านได้ฉันต้องการโปรแกรมสองรันและไม่ต้องการถามผู้ใช้สองครั้ง นี่คือสคริปต์: cp file{,.old} read -sp 'Enter password. ' PASS; echo export PASS # decode | edit | encode openssl enc -d -aes-256-cbc -k "$PASS" -in file.old | \ sed ... | openssl enc -e -aes-256-cbc -k "$PASS" -out file unset PASS รหัสผ่านนี้ไม่ปลอดภัยเนื่องจากสามารถดูรหัสผ่านได้อย่างง่ายดายโดยดูที่บรรทัดคำสั่ง บางคนสามารถอ่านโดยใช้psตัวอย่างเช่น opensslสามารถอ่านรหัสผ่านจากตัวแปรสภาพแวดล้อมดังนั้นฉันสามารถแทนที่-k "$PASS"ด้วย-pass env:PASSแต่ก็ยังไม่ปลอดภัย ตัวแปรสภาพแวดล้อมของกระบวนการใด ๆ …

3
ทำไม [-n] ไม่ผิดเหมือน [-n“”]?
คำถามของฉันเกี่ยวกับค่าตอบแทนที่ผลิตโดยรหัสนี้: if [ -n ]; then echo "true"; else echo "false"; fi ภาพพิมพ์trueนี้ การทดสอบเสริมโดยใช้[ -z ]ยังพิมพ์true: if [ -z ]; then echo "true"; else echo "false"; fi ในโค้ดด้านบนเหตุใดการ[ -n ]ทดสอบจึงถือว่าค่าสตริงที่ไม่ผ่านเลยไม่ใช่เป็นโมฆะ falseรหัสด้านล่างพิมพ์ สิ่งนี้คาดว่าจะเกิดขึ้นเนื่องจากค่าสตริงที่ผ่านเป็นโมฆะและมีความยาวเป็นศูนย์ if [ -n "" ]; then echo "true"; else echo "false"; fi
20 bash 

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