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

เชลล์เป็นอินเตอร์เฟสบรรทัดคำสั่งของ Unix คุณสามารถพิมพ์คำสั่งในเชลล์แบบโต้ตอบหรือเขียนสคริปต์เพื่อทำงานอัตโนมัติ ใช้แท็กนี้สำหรับคำถามที่ใช้กับ / bin / sh และเชลล์ที่เข้ากันได้มากที่สุด (ash, bash, ksh, zsh, …) สำหรับเชลล์สคริปต์ที่มีข้อผิดพลาดโปรดตรวจสอบใน http://shellcheck.net ก่อนโพสต์ที่นี่

2
คัดลอกไฟล์ที่มีนามสกุลหลาย ๆ ตัว
ฉันต้องการคัดลอกไฟล์ที่มีหลายนามสกุลไปยังไดเรกทอรีปลายทางเดียว ตัวอย่างเช่นฉันสามารถใช้คำสั่งต่อไปนี้เพื่อคัดลอกไฟล์. txtทั้งหมดในไดเรกทอรีทำงานไปยังไดเรกทอรีที่เรียกว่าdestination: cp -v *.txt destination/ และฉันสามารถใช้สิ่งต่อไปนี้เพื่อคัดลอกไดเรกทอรี. pngทั้งหมดในไดเรกทอรีทำงานไปที่destination: cp -v *.png destination/ แต่ใช้เวลานานในการพิมพ์คำสั่งเหล่านี้เป็นคำสั่งแยกต่างหาก (แม้จะใช้ประวัติคำสั่ง) ดังนั้นจะมีวิธีการที่ผมสามารถบอกได้ใด ๆcpในการคัดลอกไฟล์ที่มีทั้งรูปแบบ*.txt หรือรูปแบบ*.pngที่จะdestination? จะเป็นการดีที่ฉันต้องการที่จะสามารถระบุมากกว่าสองรูปแบบที่ชอบ - สอนcpการคัดลอกทั้งหมด*.txt หรือ *.png หรือ *.jpgไฟล์ไปdestinationยกตัวอย่างเช่น ฉันแน่ใจว่าทั้งหมดนี้เป็นไปได้โดยใช้เชลล์สคริปต์ - ฉันใช้bash- แต่มีวิธีใดที่จะทำให้สำเร็จได้ง่ายขึ้นเพียงจากคอนโซลหรือไม่ ฉันจะใช้การขยายรั้งเพื่อทำมันได้หรือไม่? ฉันรู้ว่ามันเป็นไปได้ที่จะคัดลอกไฟล์ทั้งหมดในไดเรกทอรีการทำงานยกเว้นที่ตรงกับรูปแบบที่ระบุบางอย่างแต่เนื่องจากไดเรกทอรีการทำงานของฉันมีนามสกุลไฟล์มากกว่าที่ฉันไม่ต้องการคัดลอกกว่าที่ฉันทำซึ่งจะเป็นความเจ็บปวด คุณมีความคิดเกี่ยวกับสิ่งนี้หรือไม่?
22 bash  shell  wildcards  cp 

4
ทำไม sudo ไม่สนใจชื่อแทน
ฉันใช้ Ubuntu 10.04 และฉันใช้upstartสำหรับการจัดการภูต แอปพลิเคชันองค์กรของฉันทำงานเป็น daemon และต้องทำงานเป็น root เนื่องจากสิทธิ์ต่างๆ เช่น: sudo start my-application-long-ID sudo stop my-application-long-ID etc ฉันอยากจะแนะนำการaliasย่อคำสั่งเหล่านี้เป็นสิ่งที่ต้องการ: alias startapp='sudo start my-application-long-ID' และเรียกใช้เป็นstartappและใช้งานได้ แต่ฉันไม่ต้องการมี sudo ในนามแฝง alias startapp='start my-application-long-ID' เมื่อไม่ได้ทำงานโดยใช้กลับsudo startappsudo: startapp: command not found อย่างไรก็ตามเมื่อฉันเพิ่มนามแฝง: alias sudo='sudo ' sudo startapp ตอนนี้ใช้ได้ แต่ฉันยังสงสัยว่าทำไม sudo ไม่สนใจชื่อแทน
22 shell  sudo  alias 

3
มีความแตกต่างที่สำคัญเมื่อเปรียบเทียบตัวแปรเป็นสตริงหรือเป็น int
จากความอยากรู้เมื่อทำการเปรียบเทียบตัวแปรทุบตี (ความคุ้มค่าเป็นinteger) ก็เป็นไปได้ที่จะทดสอบกับค่าที่กำหนดไว้ล่วงหน้าบางส่วนประกาศว่าจะเป็นหรือเป็นintstring สคริปต์ตัวอย่าง : #!/bin/bash f1() { [ "$1" == "1" ] && echo "$FUNCNAME: \"1\" compared as string" } f2() { [[ "$1" -eq 1 ]] && echo "$FUNCNAME: \"1\" compared as int" } f1 $1 f2 $1 ผลผลิต : $ ./param.sh 1 f1: "1" compared as string …
22 bash  shell  test 

17
วิธีค้นหาบรรทัดที่มีอักขระน้อยที่สุด
ฉันกำลังเขียนเชลล์สคริปต์โดยใช้คำสั่ง UNIX ทั่วไป ฉันต้องดึงสายที่มีตัวอักษรน้อยที่สุด (รวมช่องว่าง) สามารถมีได้สูงสุดประมาณ 20 บรรทัด ฉันรู้ว่าฉันสามารถใช้head -$L | tail -1 | wc -mเพื่อค้นหาจำนวนตัวอักษรของบรรทัด L ปัญหาคือวิธีเดียวที่ฉันสามารถคิดได้โดยใช้สิ่งนั้นคือการเขียนคำสั่งที่ยุ่งเหยิงหากเปรียบเทียบกับค่าต่างๆ ข้อมูลตัวอย่าง: seven/7 4for 8 eight? five! จะกลับมา4forเนื่องจากบรรทัดนั้นมีอักขระน้อยที่สุด ในกรณีของฉันหากหลายบรรทัดมีความยาวสั้นที่สุดควรจะคืนค่าหนึ่งบรรทัด ไม่สำคัญว่าจะเลือกรายการใดตราบใดที่มีความยาวต่ำสุด แต่ฉันไม่เห็นอันตรายในการแสดงทั้งสองวิธีสำหรับผู้ใช้รายอื่นที่มีสถานการณ์อื่น

1
Linux: วิธีเปลี่ยนเส้นทาง stdout & stderr ไปยัง logger?
ฉันมีโปรแกรมที่ฉันจำเป็นต้องเรียกใช้เมื่อเริ่มต้นมันมีเอาต์พุตใน stdout และ stderr ที่ฉันต้องการเปลี่ยนเส้นทางไปยังบันทึกของระบบโดยใช้คำสั่ง logger สิ่งที่ฉันมีในสคริปต์เริ่มต้นคือ: / home / dirname / application_name -v | logger 2> & 1 & นี่คือการเปลี่ยนเส้นทาง stdout เพื่อ syslog ได้ดี แต่ stderr มาถึงคอนโซลดังนั้นฉันต้องปรับแต่งคำสั่ง

3
Tilde (~) ภายในไดเร็กทอรี unix ที่ทำงาน
ดังนั้น Im ทำงานในสภาพแวดล้อม UNIX และผมสังเกตเห็นว่าภายในไดเรกทอรีการทำงานของฉันซึ่งเป็นไมล์ห่างออกไปจากบ้านของฉัน UNIX ~มี ตอนนี้ครั้งหนึ่งที่ผ่านมาฉันทำrm -rf ~จากไดเรกทอรีการทำงานของฉันและจบลงด้วยการลบไดเรกทอรีบ้านของฉันอย่างสมบูรณ์และต้องเกี่ยวข้องกับไอที ฉันไม่ต้องการที่จะทำมันอีกครั้ง ในขณะเดียวกันฉันก็อยากจะรู้ เหตุใดจึง~สร้างในไดเรกทอรีทำงานของฉัน มันลื่นนิ้วผิดพลาดในขณะที่บันทึก ( :w!แต่จะเกิดอะไรขึ้น:w~? !!) ก่อนที่จะเช็คอินมีสคริปต์ที่ค้นหาไฟล์หรือโฟลเดอร์เพิ่มเติมที่ p4 ไม่ได้รับทราบดังนั้นการกำหนดนี้~อาจทำให้เกิดปัญหา ดังนั้นฉันจะลบออก~จากไดเรกทอรีการทำงานของฉันและในเวลาเดียวกันไม่ได้ลบบ้านของฉันได้อย่างไร ฉันจะมีคำสั่งสำรองข้อมูลที่เรียกว่าที่ผมใช้แทนdel rm -rfมันเป็นเพียงแค่วางสิ่งของในสถานที่ชั่วคราว ~ฉันสามารถใช้และได้รับการกำจัดของ แต่ฉันสนใจที่จะรู้ว่าทำไมจึงเกิดเหตุการณ์นี้ขึ้นและฉันจะลบออกได้อย่างไร
22 shell  filenames  home 

4
Linux จัดการกับเชลล์สคริปต์ได้อย่างไร?
สำหรับคำถามนี้ให้พิจารณาสคริปต์เปลือก bash แม้ว่าคำถามนี้จะต้องเกี่ยวข้องกับสคริปต์เชลล์ทุกประเภท เมื่อมีคนเรียกใช้งานเชลล์สคริปต์ลินุกซ์จะโหลดสคริปต์ทั้งหมดในคราวเดียว (อาจเป็นหน่วยความจำ) หรือมันอ่านคำสั่งสคริปต์ทีละคำ (บรรทัดต่อบรรทัด) หรือไม่? กล่าวอีกนัยหนึ่งถ้าฉันเรียกใช้งานเชลล์สคริปต์และลบออกก่อนที่การดำเนินการจะเสร็จสิ้นการดำเนินการจะถูกยกเลิกหรือจะดำเนินการต่อไปตามที่เป็นอยู่หรือไม่

2
Bash ไม่ได้อ่าน. bashrc นอกจากว่าจะเริ่มด้วยตนเอง
bashจะไม่ได้มา.bashrcจากเทอร์มินัลเชิงโต้ตอบเว้นแต่ว่าฉันจะเรียกใช้bashจากเทอร์มินัลด้วยตนเอง: $ bash หรือแหล่งที่มาด้วยตนเอง: $ source ./.bashrc หรือทำงาน: $ st -e bash นี่คือผลลัพธ์ที่มีประโยชน์ฉันหวังว่า: $ echo $TERM st-256color $ echo $SHELL /bin/sh $ readlink /bin/sh bash $ shopt login_shell login_shell off ฉัน CRUX ลินุกซ์ 3.0 และฉันจะใช้และdwm stฉันพยายามใช้.bash_profileและ.profileไม่ประสบความสำเร็จ ความคิดใด ๆ
22 linux  bash  shell  bashrc 

4
ทำไมไม่มี shebang ใน. bashrc / .bash_profile
การสืบค้นง่าย ๆ : ฉันเพิ่งรู้ว่าฉันไม่เคยเห็นshebangทับ.bashrcสคริปต์ซึ่งทำให้ฉันคิดว่าระบบใช้เชลล์เริ่มต้นเพื่อหามันเมื่อล็อกอิน ( ${SHELL}) ฉันกำลังไตร่ตรองถึงสาเหตุที่เป็นเช่นนั้นคือมันถือว่าเป็นนิสัยที่ไม่ดีที่จะใช้สิ่งอื่นนอกเหนือจากเชลล์เริ่มต้นเพื่อเรียกใช้สคริปต์การเข้าสู่ระบบ

3
คุณจะส่งแอพบรรทัดคำสั่งไปยังพื้นหลังโดยตรงได้อย่างไร
ฉันรู้แล้วว่าการกดctrl+zหยุดแอพจากนั้นฉันสามารถส่งแอปไปที่พื้นหลังด้วยbgคำสั่ง แต่นั่นหมายความว่ามีช่วงเวลาสั้น ๆ ที่แอพหยุดทำงาน ฉันจะส่งแอพไปยังพื้นหลังโดยตรงโดยไม่หยุดได้อย่างไร

4
ทำไมคำสั่งบางคำสั่ง 'แฮงค์' เทอร์มินัลจนกว่าจะเสร็จสิ้น
บางครั้งคุณเรียกใช้โปรแกรมจาก terminal, พูด, †lxpanel เทอร์มินัลจะไม่ทำให้คุณกลับไปที่พรอมต์มันจะหยุดทำงาน คุณสามารถกดCtrl+ Cเพื่อกลับไปที่พรอมต์ lxpanelแต่ที่จะฆ่า อย่างไรก็ตามการกดAlt+ F2(ซึ่งปรากฏขึ้นที่หน้าต่างเพื่อรับคำสั่ง) และการทำงานจะlxpanelทำงานได้อย่างสวยงาม ทำไมนี้ อะไรคือความแตกต่างระหว่างการรันคำสั่งจากเทอร์มินัลและจากหน้าต่าง 'run' ที่ปรากฏขึ้นเมื่อคุณกดAlt+ F2? †นี่ lxpanel เพิ่งมีการใช้เป็นตัวอย่าง ฉันเคยเจอสิ่งนี้กับหลาย ๆ โปรแกรม

8
ใช้ sed เพื่อแปลงบรรทัดใหม่เป็นช่องว่าง
ว่าฉันมีตัวแปรเชลล์$stringที่เก็บข้อความที่มีบรรทัดใหม่หลายบรรทัดเช่น: string="this is a test" ฉันต้องการแปลงสตริงนี้เป็นสตริงใหม่new_stringที่การแบ่งบรรทัดทั้งหมดถูกแปลงเป็นช่องว่าง: new_string="this is a test" ฉันเหนื่อย: print $string | sed 's/\n/ /g' แต่มันไม่ทำงาน ฉันยังสงสัยว่ามีวิธีการทำเช่นนี้โดยใช้ perl -0777 's/\n/ /g'หรืออาจคำสั่งtr?
22 shell  sed 


5
ส่งออกตัวแปร env เพื่อให้พร้อมใช้งานที่เชลล์ย่อยทั้งหมดและสามารถแก้ไขได้หรือไม่
สมมติว่าฉันมี export MY_VAR=0 ใน~/.bashrc. ฉันมีขั้วคำพังเพยเปิดและในสถานีนี้เปลี่ยนแปลงฉันมูลค่าให้กับ$MY_VAR 200ดังนั้นถ้าฉันทำ echo $MY_VAR ในสถานีนี้200จะปรากฏขึ้น ตอนนี้ฉันเปิดแท็บอื่นในเทอร์มินอล gnome และทำ echo $MY_VAR ... และแทนผมมี2000 ฉันควรทำอย่างไรเพื่อยืนยันค่า 200 เมื่อเทอร์มินัลแก้ไขตัวแปรสภาพแวดล้อมทำให้การแก้ไขนี้ (การตั้งค่าเป็น 200) พร้อมใช้งานสำหรับเชลล์ย่อยที่ตามมาทั้งหมดและเช่นนั้น? เป็นไปได้ไหม

11
เครื่องมือใน UNIX เพื่อลบวันที่
มีเครื่องมือใดใน Solaris UNIX (ดังนั้นจึงไม่มีเครื่องมือ GNU) เพื่อลบวันที่หรือไม่ ฉันรู้ว่าใน Linux เรามีgawkที่สามารถลบหนึ่งวันจากที่อื่น แต่ใน Solaris ค่าสูงสุดที่เรามีคือnawk(ปรับปรุงawk) ซึ่งไม่สามารถทำการคำนวณวันที่ได้ นอกจากนี้ฉันไม่สามารถใช้ Perl มีวิธีใดในการคำนวณวันที่เป็น20100909 - 20001010อย่างไร อัปเดต: bcสามารถคำนวณวันที่ได้หรือไม่
22 shell  solaris  awk  utilities  date 

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