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

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

6
การใช้ && และ || สับสน ผู้ประกอบการ
ฉันอ่านผ่าน/etc/rc.d/init.d/sendmailไฟล์ (ฉันรู้ว่านี่ไม่ค่อยใช้ แต่ฉันกำลังเรียนเพื่อสอบ) และฉันสับสนเล็กน้อยเกี่ยวกับตัวดำเนินการ&&และตัว||ดำเนินการ ฉันอ่านที่พวกเขาสามารถใช้ในงบเช่น: if [ test1 ] && [ test2 ]; then echo "both tests are true" elif [ test1 ] || [ test2 ]; then echo "one test is true" fi อย่างไรก็ตามสคริปต์นี้แสดงคำสั่งบรรทัดเดียวเช่น: [ -z "$SMQUEUE" ] && SMQUEUE="QUEUE" [ -f /usr/sbin/sendmail ] || exit 0 สิ่งเหล่านี้ดูเหมือนจะใช้&&และ||โอเปอเรเตอร์เพื่อล้วงเอาการตอบสนองจากการทดสอบ แต่ฉันไม่สามารถขุดเอกสารเกี่ยวกับการใช้งานของผู้ให้บริการเหล่านี้ได้ …

6
ฉันจะลบ n บรรทัดแรกของไฟล์ ascii โดยใช้คำสั่ง shell ได้อย่างไร
ฉันมีไฟล์หลายไฟล์ที่มีข้อมูลข้อความ ascii ใน 5-10 บรรทัดแรกตามด้วยข้อมูลเมทริกซ์ที่จัดเรียงอย่างดี ในเชลล์สคริปต์ฉันต้องการลบข้อความสองสามบรรทัดแรกเพื่อที่ฉันจะสามารถใช้ข้อมูลเมทริกซ์บริสุทธิ์ในโปรแกรมอื่น ฉันจะใช้คำสั่ง bash shell เพื่อทำสิ่งนี้ได้อย่างไร หากเป็นความช่วยเหลือใด ๆ ฉันใช้ RedHat และระบบ Ubuntu linux

4
ความคิดเห็น Multiline shell script - มันทำงานอย่างไร
เมื่อเร็ว ๆ นี้ฉันได้พบกับประเภทความคิดเห็นหลายบรรทัดที่ฉันไม่เคยเห็นมาก่อน - นี่คือตัวอย่างสคริปต์: echo a # : aaa : ddd # echo b ดูเหมือนว่าจะใช้งานได้แม้กระทั่งvimไวยากรณ์ - ไฮไลท์ รูปแบบการแสดงความคิดเห็นนี้เรียกว่าอะไรและฉันจะหาข้อมูลเพิ่มเติมเกี่ยวกับมันได้อย่างไร

6
ฉันจะเพิ่ม (ลบ ฯลฯ ) สองตัวเลขด้วย bash ได้อย่างไร
ฉันสามารถอ่านตัวเลขและการดำเนินการด้วย: echo "First number please" read num1 echo "Second number please" read num2 echo "Operation?" read op แต่ความพยายามของฉันทั้งหมดเพื่อเพิ่มหมายเลขล้มเหลว: case "$op" in "+") echo num1+num2;; "-") echo `num1-num2`;; esac วิ่ง: First number please 1 Second mumber please 2 Operation? + เอาท์พุท: num1+num2 ...หรือ... echo $num1+$num2;; # results in: 1+2 ...หรือ... echo …

4
ฉันสามารถเพิ่ม“ && prog2” ลงใน prog1 ที่รันอยู่แล้วได้หรือไม่?
เชลล์ส่วนใหญ่มีฟังก์ชั่นเช่น&&และ;เชื่อมโยงการดำเนินการของคำสั่งด้วยวิธีการบางอย่าง แต่จะเกิดอะไรขึ้นถ้าคำสั่งกำลังทำงานอยู่ฉันยังคงสามารถเพิ่มคำสั่งอื่นที่จะดำเนินการได้หรือไม่ขึ้นอยู่กับผลลัพธ์ของคำสั่งแรก พูดว่าฉันวิ่ง $ /bin/myprog some output... /bin/myprog && /usr/bin/mycleanupแต่ผมอยาก ฉันไม่สามารถฆ่าmyprogและรีสตาร์ททุกสิ่งได้เพราะเวลามากเกินไปจะหายไป ฉันสามารถCtrl+ Zมันและfg/ bgถ้าจำเป็น สิ่งนี้ทำให้ฉันสามารถโยงในคำสั่งอื่นได้หรือไม่ ฉันสนใจทุบตีเป็นส่วนใหญ่ แต่ยินดีต้อนรับคำตอบสำหรับกระสุนทั่วไปทุกตัว!
87 bash  shell  process  exit 

4
ส่งต่อ SIGTERM ให้กับเด็กใน Bash
ฉันมี Bash script ซึ่งมีลักษณะคล้ายกับนี้: #!/bin/bash echo "Doing some initial work...."; /bin/start/main/server --nodaemon ตอนนี้ถ้า bash shell ที่เรียกใช้สคริปต์ได้รับสัญญาณ SIGTERM ก็ควรส่ง SIGTERM ไปยังเซิร์ฟเวอร์ที่กำลังรันอยู่ เป็นไปได้ไหม
86 bash  shell  signals  docker 

7
ไม่สามารถใช้เครื่องหมายอัศเจรีย์ (!) ในการทุบตี?
ฉันพยายามใช้คำสั่ง curl เพื่อเข้าถึง http url ด้วยเครื่องหมายอัศเจรีย์ ( !) ในเส้นทาง เช่น: curl -v "http://example.org/!287s87asdjh2/somepath/someresource" bash: ... event not foundคอนโซลตอบกลับด้วย เกิดขึ้นที่นี่คืออะไร? และไวยากรณ์ที่เหมาะสมในการหลีกเลี่ยงเครื่องหมายอัศเจรีย์คืออะไร

4
ทำไมการขยายพารามิเตอร์ด้วยช่องว่างโดยไม่ใส่เครื่องหมายอัญประกาศทำงานในวงเล็บสอง“ [[” แต่ไม่อยู่ในเครื่องหมายวงเล็บ”“”
ฉันสับสนกับการใช้วงเล็บเดียวหรือสองครั้ง ดูรหัสนี้: dir="/home/mazimi/VirtualBox VMs" if [[ -d ${dir} ]]; then echo "yep" fi มันทำงานได้อย่างสมบูรณ์แม้ว่าสตริงจะมีช่องว่าง แต่เมื่อฉันเปลี่ยนเป็นวงเล็บเดี่ยว: dir="/home/mazimi/VirtualBox VMs" if [ -d ${dir} ]; then echo "yep" fi มันบอกว่า: ./script.sh: line 5: [: /home/mazimi/VirtualBox: binary operator expected เมื่อฉันเปลี่ยนเป็น: dir="/home/mazimi/VirtualBox VMs" if [ -d "${dir}" ]; then echo "yep" fi มันใช้งานได้ดี ใครสามารถอธิบายสิ่งที่เกิดขึ้น? เมื่อใดที่ฉันควรกำหนดเครื่องหมายคำพูดคู่ล้อมรอบตัวแปร"${var}"เพื่อป้องกันปัญหาที่เกิดจากช่องว่าง
85 bash  quoting  ksh  test 


3
สคริปต์ใน /etc/profile.d ทำอะไรได้บ้าง
ฉันกำลังอ่านเกี่ยวกับการเขียนสคริปต์เปลือกพื้นฐานจากลินุกซ์บรรทัดคำสั่งและการเขียนสคริปต์เชลล์พระคัมภีร์ มันบอกว่า/etc/profileไฟล์ตั้งค่าตัวแปรสภาพแวดล้อมเมื่อเริ่มต้นของ Bash เชลล์ /etc/profile.dไดเรกทอรีมีสคริปต์อื่น ๆ ที่มีไฟล์เริ่มต้นโปรแกรมเฉพาะซึ่งจะดำเนินการในเวลาเริ่มต้นโดยเปลือก เหตุใดไฟล์เหล่านี้จึงไม่ได้เป็นส่วนหนึ่งของ/etc/profileหากไฟล์เหล่านี้มีความสำคัญต่อการเริ่มต้นของ Bash ด้วย หากไฟล์เหล่านี้เป็นไฟล์เริ่มต้นเฉพาะแอปพลิเคชันไม่สำคัญต่อการเริ่มต้น Bash ดังนั้นทำไมไฟล์เหล่านี้ถึงเป็นส่วนหนึ่งของกระบวนการเริ่มต้น เหตุใดจึงไม่ทำงานเฉพาะเมื่อมีการใช้งานแอปพลิเคชันเฉพาะซึ่งมีการตั้งค่า
85 bash  profile  etc 

5
ความสมบูรณ์ของบรรทัดคำสั่งจากประวัติคำสั่ง
ดังนั้นฉันจึงดูประวัติและที่Ctrl+ Rแต่พวกเขาไม่ใช่สิ่งที่ฉันคิดว่าฉันรู้ มีวิธีที่ฉันสามารถพิมพ์ในตอนต้นของคำสั่งและรอบการแข่งขันในประวัติศาสตร์ของฉันด้วยทางลัดทุบตี? # mysq(some shortcut key) ให้ฉัน: # mysqldump --add-drop-table -e -q -n -C -u (some shortcut key) # mysql -u ben.dauphinee -p

6
ประวัติทุบตี:“ การเพิกเฉย” และ“ การลบ” การตั้งค่าความขัดแย้งกับประวัติทั่วไประหว่างเซสชัน
ก่อนอื่นสิ่งนี้ไม่ได้ซ้ำกับเธรดที่มีอยู่ใน SE ฉันได้อ่านสองกระทู้นี้ ( ครั้งที่ 1 , ครั้งที่ 2 ) เกี่ยวกับประวัติทุบตีที่ดีขึ้น แต่ไม่มีคำตอบใดที่ทำงานได้ดี - ฉันมาที่ Fedora 15 แล้ว ฉันได้เพิ่มสิ่งต่อไปนี้ใน.bashrcไฟล์ในไดเรกทอรีผู้ใช้ (/ home / aahan /) และมันไม่ทำงาน ใครมีเงื่อนงำ? HISTCONTROL=ignoredups:erasedups # no duplicate entries HISTSIZE=1000 # custom history size HISTFILESIZE=100000 # custom history file size shopt -s histappend # append to history, don't overwrite …

9
จะไม่ทำสิ่งใดตลอดไปอย่างสง่างาม?
ผมมีโปรแกรมที่ก่อให้ข้อมูลที่เป็นประโยชน์ในแต่ยังอ่านจากstdout stdinฉันต้องการเปลี่ยนเส้นทางเอาต์พุตมาตรฐานไปยังไฟล์โดยไม่ต้องให้อะไรกับอินพุตมาตรฐาน จนถึงตอนนี้ดีมาก: ฉันทำได้: program > output และไม่ทำอะไรเลยใน tty อย่างไรก็ตามปัญหาคือฉันต้องการทำในพื้นหลัง ถ้าฉันทำ: program > output & โปรแกรมจะถูกระงับ ("ถูกระงับ (อินพุต tty)") ถ้าฉันทำ: program < /dev/null > output & โปรแกรมหยุดทำงานทันทีเนื่องจากถึง EOF ดูเหมือนว่าสิ่งที่ฉันต้องการก็คือการเข้าไปในท่อสิ่งที่ไม่ได้ทำอะไรสำหรับจำนวนเงินที่แน่นอนของเวลาและไม่ได้อ่านprogram stdinแนวทางต่อไปนี้ใช้ได้ผล: while true; do sleep 100; done | program > output & mkfifo fifo && cat fifo | program > output …

3
มันหมายความว่าอะไรที่จะมี $“ ดอลลาร์ - นำหน้าสตริง” ในสคริปต์?
ฉันเพิ่งเห็นสิ่งนี้ในสคริปต์ init: echo $"Stopping Apache" เครื่องหมายดอลลาร์คืออะไร การวิจัยของฉันจนถึงขณะนี้: ฉันพบสิ่งนี้ในคู่มือทุบตี: extquote หากตั้งค่า$'string'และการ$"string"อ้างอิงจะดำเนินการภายในส่วน${parameter}ขยายที่อยู่ในเครื่องหมายคำพูดคู่ ตัวเลือกนี้เปิดใช้งานโดยค่าเริ่มต้น ... แต่ฉันไม่พบความแตกต่างระหว่างสตริงที่มีและไม่มีส่วน$นำหน้า: $ echo "I am in $PWD" I am in /var/shared/home/southworth/qed $ echo $"I am in $PWD" I am in /var/shared/home/southworth/qed $ echo $"I am in ${PWD}" I am in /var/shared/home/southworth/qed $ echo "I am in ${PWD}" I …


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