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

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

4
วิธีการเปิดเทอร์มินัลแยกไปที่เทอร์มินัล 9 รายการและสลับระหว่างกันโดยใช้หนึ่งสคริปต์
ฉันต้องการเปิดเทอร์มินัลแยกออกเพื่อให้บอกว่ามี 9 ส่วน (3x3) และรันสคริปต์ทุบตี แต่สำหรับเทอร์มินัลแต่ละส่วนจะมีสคริปต์ที่แตกต่างกัน สิ่งนี้สามารถทำได้โดยใช้ Perl, Python หรือแม้กระทั่งทุบตี? ฉันจะสลับระหว่างเทอร์มินัลตัวเล็ก ๆ เหล่านั้นโดยไม่ใช้แป้นพิมพ์ลัดได้อย่างไร terminatorโอ้โดยวิธีการที่ผมใช้ และถ้ามีเทอร์มินัลอีมูเลเตอร์อื่นที่เปิดใช้งานฟังก์ชั่นนี้มันคืออะไร?

3
เครื่องหมายวงเล็บในเงื่อนไข if: เหตุใดฉันจึงได้รับข้อผิดพลาดทางไวยากรณ์โดยไม่มีช่องว่าง
ฉันใช้สคริปต์ด้านล่างเพื่อย้ายสองวันกลับเมื่อสคริปต์ทำงานที่เริ่มต้นสองวันของปีและตรวจสอบวันแรกและวันที่สองของทุกเดือนและย้ายกลับสองวัน if [$month="01"] && [$day="01"]; then date="$last_month/$yes_day/$last_year" fulldate="$last_month/$yes_day/$last_year" else if [$month="01"] && [$day="02"]; then date="$last_month/$yes_day/$last_year" fulldate="$last_month/$yes_day/$last_year" else if [ $day = "01" ]; then date="$last_month/$yes_day/$year" fulldate="$year$last_month$yes_day" else if [ $day = "02" ]; then date="$last_month/$yes_day/$year" fulldate="$year$last_month$yes_day" else date="$month/$yes_day/$year" fulldate="$year$month$yes_day" fi fi fi fi แต่ฉันไม่ดีได้รับข้อความแสดงข้อผิดพลาดด้านล่าง Etime_script.sh: line 19: [06=01]: command not …

7
ฉันจะเปิดไฟล์ที่เป็นผลมาจาก grep ได้อย่างไร
ฉันมักจะ grep มัดไฟล์เพื่อค้นหาบรรทัดแล้ว grep ส่งคืนหนึ่งผลลัพธ์ แทนที่จะคัดลอกและวางชื่อไฟล์ลงในคำสั่งใหม่ฉันต้องการที่จะสามารถเปิดผลลัพธ์นั้นด้วยเครื่องมือแก้ไข grep foo | vimสิ่งที่ชอบ: มีวิธีทำใน BASH หรือไม่?
17 bash  grep 

3
เซสชัน tmux ใหม่ไม่ได้มาไฟล์ bashrc
สรุป เมื่อฉันสร้างเซสชั่น tmux ใหม่พรอมต์ของฉันจะดึงจากการกำหนดค่า bash เริ่มต้นและฉันต้องเรียกใช้ด้วยตนเองที่source ~/.bashrcกำหนดเอง การวิเคราะห์ ฉันใช้เครื่อง RHEL 7 ฉันเริ่มสังเกตเห็นพฤติกรรมนี้หลังจากที่ทุบตีอัปเดตไปพักหนึ่ง แต่ยังไม่ได้ไปถามคำถามจนถึงตอนนี้ ตัวอย่างเช่นฉันปรับแต่งการแจ้งเตือนของฉันให้มีลักษณะดังนี้: [user@hostname ~]$ เมื่อใดก็ตามที่ฉันเริ่มต้นเซสชั่น tmux ใหม่มันใช้สิ่งที่ดูเหมือนจะเป็นค่าเริ่มต้นทุบตี: -sh-4.2$ การดำเนินการอย่างรวดเร็วของการsource ~/.bashrcแก้ไขปัญหาเสมอ แต่ก็น่ารำคาญที่ฉันต้องทำเช่นนี้ทุกครั้งที่ฉันต้องการแก้ไขสิ่งเล็ก ๆ มีความคิดเห็นเกี่ยวกับวิธีการใช้ tmux ในการทำเช่นนี้อีกครั้งโดยอัตโนมัติหรือไม่? หากต้องการข้อมูลเพิ่มเติมใด ๆ ฉันยินดีที่จะให้ tmux.conf สำหรับการอ้างอิงฉันมีtmux.confไฟล์ของฉันด้านล่างแม้ว่ามันจะไม่ค่อยเป็นสิ่งที่คุณจะเรียกว่ากำหนดเองได้ setw -g mode-keys vi # reload tmux.conf bind r source-file ~/.tmux.conf \; display-message " ✱ ~/.tmux.conf is reloaded"
17 bash  tmux 

4
คำนำหน้าและสตริงต่อท้ายไปยังแต่ละบรรทัดออกจากคำสั่ง
ฉันพบปัญหาขณะพยายามเขียนสคริปต์ Bash เมื่อgrepผลลัพธ์มันจะส่งคืน (ปกติ) หลายบรรทัด ฉันต้องการคำนำหน้าและต่อท้ายสตริงกับแต่ละบรรทัดเอาต์พุตเหล่านี้ ฉันยังต้องการที่จะทราบว่าฉันท่อlsเข้าgrepเช่น: ls | grep

3
การหาสคริปต์ Bash - ส่งคืนข้อผิดพลาดแทนที่จะออกหรือไม่
ฉันกำลังหาสคริปต์ทุบตีในเทอร์มินัลดังนั้นออกจากข้อผิดพลาดด้วย set -o errexit ฆ่า terminal ของฉันซึ่งเป็นสิ่งที่น่ารำคาญอย่างมากเพราะฉันต้องปิดเครื่องเทอร์มินัลเปิดอีกอันหนึ่งและรีเซ็ตตัวแปรบางตัว จนถึงตอนนี้การใช้ command || return บรรทัดในสคริปต์ทำสิ่งที่ฉันต้องการอย่างแน่นอน set -o errexit ที่จะทำ ... แต่ฉันต้องการให้มันทำเพื่อทั้งสคริปต์; ไม่ใช่แค่หนึ่งบรรทัด / คำสั่ง ฉันมีไฟล์ที่เต็มไปด้วยคำสั่งสำหรับการตั้งค่าไซต์และฉันไม่ควรทำคำสั่ง || กลับ สำหรับทุก ๆ บรรทัดในไฟล์ มีตัวเลือกชุดอื่นหรืออะไรที่จะ "คืน" แทนที่จะออกจากเทอร์มินัล - เพื่อความชัดเจนฉันต้องการฆ่าสคริปต์และออกจากเทอร์มินัลในสถานะเดียวกับที่กด ctrl + C เพื่อฆ่าเซอร์วิสที่รันในเทอร์มินัล command || returnทำอย่างนั้น แต่ฉันไม่ต้องการที่จะยึดติด|| returnกับทุกบรรทัดในไฟล์ ดังนั้นฉันกำลังมองหาสิ่งที่คล้ายกับset -o errexitที่ไม่ได้ทำให้สถานีปิดตัวลง --- หมายเหตุ: การสร้างสคริปต์โง่ที่มีสองบรรทัดในนั้น (super.sh): create_path=~/Desktop/site_builder/create.sh source …

2
Alt-Left เพื่อข้ามคำไม่ทำงานในเทอร์มินัลอีมูเลเตอร์
บนเครื่อง Debian Wheezy ที่งานก่อนหน้านี้ฉันคุ้นเคยกับ Alt + Left และ Alt + Right เพื่อข้ามระหว่างคำในบรรทัดคำสั่งที่ใช้งานอยู่ (เป็นทุบตี) แต่เนื่องจากที่บ้านผมได้อัพเกรดไปเจสซี่ (Debian 8.0 การทดสอบสาขา) นี้ไม่ได้ทำงานอีกต่อไป: แทนการกระโดดข้ามกับคำพูดก่อนหน้า Alt-ซ้ายพิมพ์สิ่งที่ต้องการหรือD [DOTOH ถ้าฉันเปิด ssh และเชื่อมต่อกับ Debian Wheezy ที่ไม่มีหัวของฉันมันจะทำงานได้อย่างสมบูรณ์แบบ นอกจากนี้ฉันเพิ่งติดตั้ง Fedora 20 ในงานใหม่ของฉันและที่นี่มีพฤติกรรมเหมือนกัน สิ่งนี้ใช้กับ bash, csh และ ksh (เริ่มต้นภายใต้env -i), เช่นเดียวกับ rxvt-unicode และ xfce4-terminal ดังนั้นมันจะต้องเป็นสิ่งที่อยู่นอกระดับเหล่านี้ ฉันควรมองหาความแตกต่างที่ไหน

2
คัดลอกและตั้งเครื่องหมายใน Bash เช่นเดียวกับ Emacs?
ผมอยากที่จะสามารถคัดลอกและวางข้อความในบรรทัดคำสั่งในทุบตีใช้ผูกแป้นพิมพ์เดียวกันกับที่ใช้ Emacs โดยค่าเริ่มต้น (เช่นใช้C-spaceสำหรับset-mark, M-wเพื่อคัดลอกข้อความC-y, M-yการวาง ฯลฯ ) เอกสาร GNU ทุบตีบอกว่าทุบตีมาพร้อมกับบางส่วนของปุ่มลัดเหล่านี้ตั้งขึ้นโดยค่าเริ่มต้น ตัวอย่างเช่น yanking ( C-y) ทำงานโดยค่าเริ่มต้นในเทอร์มินัลของฉัน อย่างไรก็ตามฉันไม่สามารถรับset-markและcopyสั่งให้ทำงานได้และดูเหมือนว่าพวกเขาจะไม่ถูกผูกไว้กับปุ่มใด ๆ โดยค่าเริ่มต้น .inputrcโดยปกติวิธีที่ผู้ใช้สามารถกำหนดของเธอเองผูกที่สำคัญคือการเพิ่มพวกเขาไป ดังนั้นฉันจึงค้นหาและพบฟังก์ชันทุบตีต่อไปนี้ในเอกสารที่ฉันคิดว่าสามารถช่วยฉันกำหนดพฤติกรรมที่คล้ายกับ Emacs ที่ฉันต้องการ (เช่นset-markกับC-spaceและcopyด้วยM-w) copy-region-as-kill () คัดลอกข้อความในพื้นที่ไปยังบัฟเฟอร์การฆ่าเพื่อให้สามารถดึงได้ทันที โดยค่าเริ่มต้นคำสั่งนี้ไม่ได้ผูกไว้ และ set-mark (C-@) ตั้งเครื่องหมายไปที่จุด หากมีการให้อาร์กิวเมนต์ที่เป็นตัวเลขเครื่องหมายถูกตั้งไว้ที่ตำแหน่งนั้น หากฉันเข้าใจอย่างถูกต้องหมายถึงข้างต้นที่copy-region-as-killไม่ได้ผูกไว้กับลำดับคีย์บอร์ดใด ๆ โดยค่าเริ่มต้นในขณะที่set-markถูกผูกไว้C-@โดยค่าเริ่มต้น ฉันลองใช้C-@เทอร์มินัลของฉัน แต่ฉันไม่คิดว่ามันจะทำงานset-markเพราะฉันไม่เห็นข้อความที่ไฮไลต์เมื่อฉันเลื่อนเคอร์เซอร์ ในกรณีใด ๆ ฉันพยายามเพิ่มการผูกแป้นพิมพ์ ( M-wและC-) เพื่อฟังก์ชั่น copy-region-as-killและset-markข้างต้นของฉัน.inputrcแล้วโหลดมันด้วยC-x C-rแต่ตอนนี้ไม่ได้ทำงาน ฉันรู้ว่ารายการอื่น ๆ ของฉัน.inputrcทำงานเพราะฉันมีการโยงคีย์อื่น ๆ …

2
เหตุใดอักขระ Unicode บางตัวจึงไม่พิมพ์ไปยังเทอร์มินัลของฉัน
ฉันกำลังเรียกใช้ Arch Linux ด้วยเทอร์มินัลอย่างง่ายโดยใช้แบบอักษร Adobe Source Code Pro LANG=en_US.UTF-8สถานที่เกิดเหตุของฉันเป็นที่ตั้งอย่างถูกต้อง ฉันต้องการพิมพ์อักขระ Unicode ที่เป็นตัวแทนการเล่นไพ่ไปยังเทอร์มินัลของฉัน ฉันใช้วิกิพีเดียสำหรับการอ้างอิง อักขระ Unicode สำหรับการ์ดทำงานได้ดี ตัวอย่างเช่นการออก $ printf "\u2660" พิมพ์หัวใจสีดำไปที่หน้าจอ อย่างไรก็ตามฉันมีปัญหากับการเล่นไพ่โดยเฉพาะ ออก $ printf "\u1F0A1" พิมพ์สัญลักษณ์Ἂ1แทนเอซโพดำ🂡 เกิดอะไรขึ้น ปัญหานี้ยังคงมีอยู่ในหลายเทอร์มินัล (urxvt, xterm, ปลวก) และตัวอักษรทุกตัวที่ฉันได้ลอง (DejaVu, Inconsolata)
16 bash  fonts  unicode  printf 

2
`. []. foo []` ทำอะไรด้วยการทุบตี? ทำไมมันตรงกับ `.. '
ดูที่ต่อไปนี้: $ echo .[].aliases[] .. $ echo .[].foo[] .. $ echo .[].[] .. $ echo .[].xyz[] .. $ echo .xyz[].xyz[] .xyz[].xyz[] $ echo .xyz[].[] .xyz[].[] เห็นได้ชัดว่านี่ดูเหมือนจะมีบางสิ่งบางอย่าง แต่ฉันไม่เข้าใจว่าผลลัพธ์มารวมกันได้อย่างไร จากความเข้าใจของฉัน[]เป็นคลาสตัวละครที่ว่างเปล่า มันจะง่ายถ้า มันจับคู่เฉพาะสตริงว่าง ในกรณีนี้ฉันคาดหวังว่า bash จะทำซ้ำทั้งหมดเนื่องจากไม่มีสิ่งใดตรงกับในไดเรกทอรีนี้ แต่ยังจับคู่สิ่งต่าง ๆ เช่น..aliases(ในตัวอย่างแรก) หรือไม่มีอะไรเลย ในกรณีนี้ฉันคาดหวังว่า bash จะทำซ้ำสตริงทั้งหมด นี่คือกับ GNU bash, รุ่น 4.4.23 (1) - ปล่อย
16 bash  shell  wildcards 

4
ฉันจะแสดงชื่อผู้ใช้และ / หรือโฮมไดเร็กตอรี่ทั้งหมดได้อย่างไร?
ฉันต้องการแสดงรายการผู้ใช้ทั้งหมดบนเครื่องโดยปกติแล้วฉันจะทำ: ls -l /home แต่ฉันใช้มันในสคริปต์ที่จะติดตั้งบนเครื่องอื่นและอาจใช้กับเครื่องที่พวกเขาไม่เรียกมันว่าบ้าน (เช่น myHome) ls -l ~ดังนั้นผมจึงต้องการที่จะพูดคุยมัน แต่มันจะแสดงรายชื่อผู้ใช้ที่บ้านของฉันแทนที่จะเป็นชื่อผู้ใช้ที่บ้าน (โดยทั่วไปฉันต้องการรับรายชื่อผู้ใช้บนเครื่อง) ฉันจะพูดคุยเรื่องนี้ได้อย่างไร

2
เอาท์พุทการทดแทนกระบวนการออกคำสั่ง
echo one; echo two > >(cat); echo three; คำสั่งให้ผลลัพธ์ที่ไม่คาดคิด ฉันอ่านสิ่งนี้: วิธีการใช้กระบวนการทดแทนในทุบตีอย่างไร และบทความอื่น ๆ อีกมากมายเกี่ยวกับการทดแทนกระบวนการบนอินเทอร์เน็ต แต่ไม่เข้าใจว่าทำไมจึงมีพฤติกรรมเช่นนี้ ผลลัพธ์ที่คาดหวัง: one two three ผลผลิตจริง: prompt$ echo one; echo two > >(cat); echo three; one three prompt$ two ทั้งสองคำสั่งนี้ควรจะเทียบเท่ากับมุมมองของฉัน แต่พวกเขาไม่ได้: ##### first command - the pipe is used. prompt$ seq 1 5 | cat 1 …

1
ทาร์ไฟล์ที่มีวันที่เป็นชื่อ?
ฉันพยายามที่จะ tar และ gzip ไฟล์ที่มีวันที่และเวลาเป็นชื่อ: date=$(date '+%d-%m-%Y_%H:%M:%S'); tar -zcf "$date".tar.gz repo/bin/ แต่ฉันกลับมา: tar (child): Cannot connect to 17-08-2017_21: resolve failed tar: Child returned status 128 tar: Error is not recoverable: exiting now เกิดอะไรขึ้นที่นี่และฉันจะแก้ไขได้อย่างไร tar พยายามเชื่อมต่อกับชื่อราวกับว่าเป็น IP หรือไม่
16 bash  tar 

8
ฉันจะนับจำนวนครั้งที่ลำดับไบต์เกิดขึ้นในไฟล์ได้อย่างไร
ฉันต้องการนับกี่ครั้งที่ลำดับของไบต์เกิดขึ้นภายในไฟล์ที่ฉันมี ตัวอย่างเช่นฉันต้องการค้นหาจำนวนครั้งที่\0xdeadbeefเกิดขึ้นภายในไฟล์ที่ปฏิบัติการได้ ตอนนี้ฉันกำลังใช้ grep: #/usr/bin/fish grep -c \Xef\Xbe\Xad\Xde my_executable_file (ไบต์ถูกเขียนในลำดับย้อนกลับเนื่องจาก CPU ของฉันเป็น endian น้อย) อย่างไรก็ตามฉันมีปัญหาสองประการเกี่ยวกับวิธีการของฉัน: \Xnnลำดับการหลบหนีเหล่านั้นใช้ได้เฉพาะในเปลือกปลาเท่านั้น grep กำลังนับจำนวนบรรทัดที่มีหมายเลขเวทย์มนตร์ของฉัน หากรูปแบบเกิดขึ้นสองครั้งในบรรทัดเดียวกันมันจะนับเพียงครั้งเดียว มีวิธีแก้ไขปัญหาเหล่านี้หรือไม่? ฉันจะทำให้หนึ่งซับนี้ทำงานในเปลือก Bash และนับจำนวนครั้งอย่างถูกต้องรูปแบบที่เกิดขึ้นภายในไฟล์ได้อย่างไร

5
ฉันจะแปลงตัวเลขเปอร์เซียเป็น UTF-8 เป็นตัวเลขยุโรปใน ASCII ได้อย่างไร
ในตัวเลขเปอร์เซีย۰۱۲۳۴۵۶۷۸۹เท่ากับ0123456789ในหลักยุโรป ฉันจะแปลงหมายเลขเปอร์เซีย (เป็นUTF-8) เป็น ASCII ได้อย่างไร ตัวอย่างเช่นผมต้องการที่จะกลายเป็น۲۱21

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