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

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

2
เป็น“ $” หรือไม่ (เครื่องหมายคำถามดอลลาร์) มีเฉพาะในเปลือก Bash เท่านั้น
ในBashเปลือกฉันสามารถรับสถานะออกจากคำสั่งผ่าน$?ตัวแปร: # ps -ef | grep "haha" root 15439 15345 0 23:02 pts/0 00:00:00 grep --color=auto haha # echo $? 0 มีเฉพาะใน Bash shell เท่านั้นหรือไม่ หรือฉันจะใช้มันในเปลือกหอยอื่นได้หรือไม่

2
เหตุใดขณะหนึ่งลูปจึงหยุดหลังจากถูกระงับ
ทำไมการใช้ bash และหยุดชั่วขณะหนึ่งวงจึงหยุดลงหลังจากกลับมาทำงานต่อ ตัวอย่างสั้น ๆ ด้านล่าง $ while true; do echo .; sleep 1; done . . ^Z [1]+ Stopped sleep 1 $ fg sleep 1 $ ฉันคุ้นเคยกับสัญญาณและฉันเดาว่านี่อาจเป็นพฤติกรรมตามธรรมชาติของการทุบตีที่นี่ แต่ฉันต้องการที่จะเข้าใจมากขึ้นว่าทำไมมันทำงานในลักษณะนี้โดยเฉพาะ

2
แทนที่กระบวนการปัจจุบันด้วยกระบวนการ / กระบวนการลูก
ฉันมีโปรแกรมPที่คาดว่าจะได้รับ "สวัสดี" และส่งออก "ทำไม" ก่อนที่จะให้คุณสมบัติ คุณลักษณะนี้ใช้งานโดยโปรแกรมอื่นที่ไม่ทราบว่ามันเป็นมารยาททั่วไปในการเริ่มการสนทนากับ "Hello" ฉันจึงต้องการเขียน wrapper สำหรับPที่ทำงานเช่นนี้ (ไวยากรณ์ zsh): coproc P print -p Hello # Send Hello to P read -pr line # Read what P has to say [[ "$line" = "Why?" ]] && Replace current process with the coprocess. echo Could not get P's attention. …
10 shell  scripting  process  zsh 

4
ทำไมโปรแกรมของฉันถูกเรียกว่า "set" ไม่ถูกเรียกใช้งาน?
ฉันได้สร้างโปรแกรม C อย่างง่ายเช่นนั้น: int main(int argc, char *argv[]) { if (argc != 5) { fputs("Not enough arguments!\n", stderr); exit(EXIT_FAILURE); } และฉันมีเส้นทางของฉันแก้ไขในetc / bash.bashrcเช่นนั้น PATH=.:$PATH ฉันได้บันทึกโปรแกรมนี้เป็น set.c และกำลังรวบรวมด้วย gcc -o set set.c ในโฟลเดอร์ ~/Programming/so อย่างไรก็ตามเมื่อฉันโทร set 2 3 ไม่มีอะไรเกิดขึ้น. ไม่มีข้อความที่ปรากฏ การเรียกร้อง ./set 2 3 ให้ผลลัพธ์ที่คาดหวัง ฉันไม่เคยมีปัญหากับ PATH มาก่อนและ which set ./setผลตอบแทน …

3
ดำเนินการคำสั่งทุก ๆ X วินาที
ฉันต้องการที่จะดำเนินการคำสั่งนับ 10 วินาทีและมีมันดำเนินการในพื้นหลัง (จึงไม่watch?) คำตอบทั้งหมดแสดงบางอย่างเช่นต่อไปนี้ แต่จะดำเนินการ 11 ถึง 14 วินาที สิ่งนี้จะสำเร็จได้อย่างไร while true; do # perform command that takes between 1 and 4 seconds sleep 10 done

2
จะส่งเอาต์พุตทั้งหมดไปยัง 'logger' ใน POSIX เชลล์ได้อย่างไร?
ฉันต้องการที่จะเข้าสู่ระบบการส่งออกมาตรฐานและข้อผิดพลาดมาตรฐานแยกต่างหากในการใช้.xprofile loggerใน Bash ฉันคิดว่ามันจะมีหน้าตาแบบนี้: exec 1> >(logger --priority user.notice --tag $(basename $0)) \ 2> >(logger --priority user.error --tag $(basename $0)) ฉันจะทำสิ่งนั้นในลักษณะที่รองรับPOSIX /bin/shได้อย่างไร
10 shell  pipe  posix 

7
ฉันจะสร้างสคริปต์ให้นับด้วยห้าคนได้อย่างไร
ฉันพยายามสร้างสคริปต์ทุบตีที่ง่ายมากเพื่อแสดงรายการทวีคูณของห้าทั้งหมดระหว่าง 375 และ 3500 (375, 380, 385 ... ) สิ่งหนึ่งที่ฉันพยายามและไม่ได้ผลคือ: for i in {375..3500} do echo $i (($i += 5)) done ฉันสละเวลาสักครู่แล้วเขียนมันในภาษาเบสิกในเวลาประมาณ 15 วินาที: 10 count = 375 20 print count 30 count = count+5 40 if count < 3500 then goto 20 ฉันจะทำให้โปรแกรม BASIC เป็นสคริปต์ทุบตีได้อย่างไร
10 bash  shell  scripting 

2
เชลล์เนมสเปซ
มีวิธีsourceเชลล์สคริปต์ในเนมสเปซหรือไม่โดยเฉพาะอย่างยิ่งสคริปต์เชลล์ทุบตี แต่ฉันจะดูเชลล์อื่น ๆ หากมีคุณลักษณะนี้และทุบตีไม่ได้ สิ่งที่ฉันหมายถึงคือเช่น "นำหน้าสัญลักษณ์ที่กำหนดไว้ทั้งหมดด้วยบางสิ่งบางอย่างเพื่อให้พวกเขาไม่ได้ชนกับสัญลักษณ์ที่กำหนดไว้แล้ว (ชื่อตัวแปรชื่อฟังก์ชันชื่อแทน)" หรือสิ่งอำนวยความสะดวกอื่น ๆ ที่ป้องกันการชนชื่อ หากมีวิธีการแก้ปัญหาที่ฉันสามารถ namespace ในsourceเวลา ( NodeJSสไตล์) นั่นจะดีที่สุด รหัสตัวอย่าง: $ echo 'hi(){ echo Hello, world; }' > english.sh $ echo 'hi(){ echo Ahoj, světe; }' > czech.sh $ . english.sh $ hi #=> Hello, world $ . czech.sh #bash doesn't even warn …
10 shell 

1
การแทนที่ Bash พร้อมตัวแปรที่กำหนดจากรูปแบบ glob
ตัวอย่างด้านล่างอธิบายถึงปัญหา เหตุใดจึงFILENAMEพิมพ์อย่างถูกต้องเมื่อสะท้อนและรับรู้เป็นรูปแบบเมื่อใช้การทดแทน? #!/bin/bash FILEPATH_WITH_GLOB="/home/user/file_*" FILENAME=$(basename "$FILEPATH_WITH_GLOB") echo $FILENAME #file_1234 echo ${FILENAME:1:5} #ile_* <---why is this not ile_1

6
การลบไฟล์ด้วยช่องว่างในชื่อของพวกเขา
ฉันพยายามลบไฟล์ทั้งหมดที่มีช่องว่างในชื่อของพวกเขา ฉันใช้คำสั่งดังต่อไปนี้ แต่มันทำให้ฉันมีข้อผิดพลาด คำสั่ง: ls | egrep '. ' | xargs rm ที่นี่ถ้าฉันใช้ls | egrep '. 'คำสั่งเพียงอย่างเดียวมันให้ชื่อไฟล์ทั้งหมดพร้อมช่องว่างในชื่อไฟล์ แต่เมื่อฉันพยายามที่จะส่งออกไปยัง rm ช่องว่างทั้งหมด (นำหน้าหรือต่อท้าย) จะถูกลบ ดังนั้นคำสั่งของฉันไม่ได้รับการดำเนินการอย่างถูกต้อง ตัวชี้ใด ๆ เกี่ยวกับวิธีลบไฟล์ที่มี atleast หนึ่งช่องว่างในชื่อของพวกเขา?
10 shell  quoting  rm  xargs 

1
ติดตามพารามิเตอร์บางอย่างในคำสั่งบางอย่าง
สมมติว่าฉันมีคำสั่งgit branch(เช่นมีคำสองคำ) เสมอ สิ่งที่ฉันต้องการคือการติดตามเมื่อคำสั่งนี้จะถูกดำเนินการกับข้อโต้แย้ง ตัวอย่างเช่นถ้าฉันรันคำสั่งgit branch developโดยไม่มีข้อผิดพลาดฉันต้องการบันทึกdevelopไฟล์ ฉันพยายามเขียนทับคำสั่ง git บนของฉัน.bash_profileบางอย่างเช่นนี้: git () { if [ $# -eq 3 ] then git $@ echo $2 > /path/tacked_parameters.txt else git $@ fi } แต่ดูเหมือนว่าใช้งานไม่ได้ดี มีวิธีการทำเช่นนี้?
10 bash  shell  function 

5
เปลี่ยนเขตเวลาของ cronjob
ฉันมี cronjob ซึ่งดำเนินการทุกวันเวลา 9:00 น. เวลา UTC ฉันอยู่ใน GMT + 1 ดังนั้นจึงดำเนินการเวลา 10:00 น. ตามเวลาท้องถิ่น เมื่อมีการเปลี่ยนแปลงเขตเวลา (เป็นปรับเวลาตามฤดูกาล DST) cronjob จะยังคงดำเนินการเวลา 9:00 น. เวลา UTC แต่เวลา 11:00 น. ตามเวลาท้องถิ่น แต่ฉันต้องการให้มันทำงานในเวลา 10:00 ไม่ว่าจะเป็นฤดูร้อนหรือไม่ก็ตาม ฉันจะทำอย่างไร
10 shell  cron  timezone 

3
ไพพ์สคริปต์ด้วย“ อ่าน” เพื่อทุบตี
ฉันต้องการเรียกใช้สคริปต์โดยการไพพ์สคริปต์ผ่านbashด้วยwget(แทนที่จะรันสคริปต์โดยตรงด้วยการทุบตี) $ wget -O - http://example.com/my-script.sh | bash มันไม่ทำงานเพราะสคริปต์ของฉันมีreadข้อความอยู่ ด้วยเหตุผลบางอย่างสิ่งเหล่านี้ใช้ไม่ได้เมื่อไปป์เพื่อทุบตี: # Piping to bash works in general $ echo 'hi' hi $ echo "echo 'hi'" | bash hi # `read` works directly $ read -p "input: " var input: <prompt> # But not when piping - returns immediately $ echo …
10 bash  shell  pipe  read 

1
สะท้อนความคืบหน้าจากกระบวนการพื้นหลังโดยไม่ต้องไฮแจ็ก
พิจารณาสคริปต์ง่าย ๆhello: #!/bin/bash echo 'hello world!' ตอนนี้จากทุบตีถ้าฉันพยายามเรียกใช้ในพื้นหลัง: $ hello & [1] 12345 $ hello world! █ <--- prompt is stuck here until I hit enter! [1]+ Done $ █ <--- prompt back to normal สิ่งที่ฉันอยากเห็น: $ hello & [1] 12345 [1]+ hello world! [1]+ Done $ █ <--- prompt normal …

1
เจนกินส์ไม่ได้ใช้ตำแหน่งที่ตั้งของระบบ
ฉันมีพฤติกรรมที่น่าสนใจในเจนกินส์ เชลล์ของ Jenkins ไม่ได้ใช้ระบบตำแหน่งที่ตั้งของฉัน เจนกินส์ทำงานเป็นผู้ใช้jenkinsในระบบของฉัน เข้าสู่ระบบjenkinsผ่านทาง SSH: locale แสดง: LANG = en_US.UTF-8 LANGUAGE = th_: en LC_CTYPE = "en_US.UTF-8" ฯลฯ ... envการแสดงLANGและLANGUAGEตัวแปร: LANG = en_US.UTF-8 LANGUAGE = en_US: en id แสดง ID ของผู้ใช้: uid = 1008 (jenkins) gid = ... ป้อนคำสั่งด้านบนลงในเชลล์งาน jenkins: locale แสดง: LANG = LANGUAGE = LC_CTYPE = …

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