Unix & Linux

คำถาม & คำตอบสำหรับผู้ใช้ Linux, FreeBSD และระบบปฏิบัติการ Un * x อื่น ๆ

2
สคริปต์ Bash ควรฆ่าอินสแตนซ์เหล่านั้นของสคริปต์อื่นที่เปิดตัว
ในสถานการณ์ปัจจุบันบางสคริปต์ 'calling.sh' เปิดตัวอีกสคริปต์ 'called.sh' ในพื้นหลังดำเนินการดำเนินการอื่น ๆ นอนในขณะที่แล้วสิ้นสุด 'called.sh' pkill called.shด้วย มันใช้งานได้ดี จากนั้นฉันก็อยากจะเปิดตัว 'เรียกว่า. sh' จากเทอร์มินัลอื่นเป็นสคริปต์แบบสแตนด์อโลนในเวลาอื่น ๆ ไม่ว่าจะก่อนหรือหลังการเปิดตัว calls.sh อินสแตนซ์อิสระเหล่านี้ไม่ควรถูกฆ่าโดย 'calling.sh' ฉันจะบรรลุสิ่งนี้ได้อย่างไร สัญชาตญาณบอกว่าสคริปต์การโทรควรจะสามารถบอกกระบวนการที่เริ่มต้นจากชื่ออื่น ๆ ที่กำลังทำงานอยู่ในขณะเดียวกัน ในฐานะที่เป็นตัวแปร 'calling.sh' อาจเปิดตัว 'เรียกว่า' ซึ่งเป็นลิงก์สัญลักษณ์ไปยัง 'เรียกว่า' sh ' สิ่งนี้ซับซ้อนกว่าการจัดการสถานการณ์ข้างต้นหรือไม่? ข้อควรระวังและการปรับเฉพาะใดที่ใช้ลิงค์สัญลักษณ์จำเป็นต้องใช้?
11 bash  process 

2
ลบทุกบรรทัดที่ไม่มีอักขระ n ก่อนตัวคั่น
ฉันมีไฟล์ข้อความที่ยาวมาก (จากที่นี่ ) ซึ่งควรมีอักขระฐานสิบหก 6 ตัวและ 'ตัวแบ่ง' (ซึ่งปรากฏเป็นอักขระตัวเดียวและดูเหมือนจะไม่แสดงอย่างถูกต้องในการทำเครื่องหมายรหัสด้านล่าง) ตามด้วยคำสองสามคำ: 00107B Cisco Systems, Inc 00906D Cisco Systems, Inc 0090BF Cisco Systems, Inc 5080 Cisco Systems, Inc 0E+00 ASUSTek COMPUTER INC. 000C6E ASUSTek COMPUTER INC. 001BFC ASUSTek COMPUTER INC. 001E8C ASUSTek COMPUTER INC. 0015F2 ASUSTek COMPUTER INC. 2354 ASUSTek COMPUTER INC. 001FC6 …


2
ใช้คำสั่ง chmod อย่างคัดเลือก
ฉันต้องการตั้งค่าการอนุญาต 755 ในทุกไฟล์และไดเรกทอรีย่อยภายใต้ไดเรกทอรีเฉพาะ แต่ฉันต้องการรัน chmod 755 เฉพาะสำหรับองค์ประกอบเหล่านั้นซึ่งไม่ได้รับอนุญาต 755 find /main_directory/ -exec chmod 755 {} \; หากfindคำสั่งส่งคืนรายการแบบยาวสิ่งนี้จะใช้เวลานาน ฉันรู้ว่าฉันสามารถใช้คำสั่ง stat เพื่อตรวจสอบการอนุญาตระดับไฟล์ Octal ของแต่ละองค์ประกอบจากนั้นใช้ if-else เพื่อสลับการอนุญาตไฟล์ แต่มีวิธีการบรรทัดเดียวที่ใช้findและxargsก่อนอื่นตรวจสอบสิทธิ์ไฟล์ / ไดเรกทอรีที่มี แล้วใช้chmodเพื่อเปลี่ยนเป็น 755 หากตั้งค่าเป็นอย่างอื่น

1
จะทำให้ Gnu / Linux เชื่อถือใบรับรองที่ Windows เชื่อถือได้หรือไม่
มีเซิร์ฟเวอร์ที่มีห่วงโซ่ SSL ใช้งานไม่ได้ดังที่รายงานโดยการตรวจสอบ SSL นี้ : ฉันรู้ว่านี่เป็นปัญหาที่ควรแก้ไขในเซิร์ฟเวอร์ แต่บางครั้งมันก็ยากที่จะแก้ไข (ฉันไม่ใช่ผู้ดูแลระบบของเซิร์ฟเวอร์) สิ่งนี้คือ Chrome / Mozilla / Edge บน Windows เชื่อถือใบรับรองเว็บไซต์ต่อไป : อย่างไรก็ตามในการปรับใช้ Gnu / Linux (Ubuntu 18.04 ใน Docker) ใบรับรองไม่น่าเชื่อถือ: curl: (60) SSL certificate problem: unable to get local issuer certificate ฉันลองupdate-ca-certificatesและแม้แต่นำเข้าใบรับรองหลักของ Globalsign update-ca-certificatesรายงานใบรับรองซ้ำในกรณีนั้น อย่างไรก็ตามไม่มีอะไรทำงาน วิธีการทำซ้ำ ใช้นักเทียบท่า: docker run -it ubuntu:18.04 # …

4
ทำไมการเขียนข้อมูลแบบสุ่มโดยใช้ dd ส่งผลให้เกิดพาร์ติชั่นดิสก์?
ก่อนที่จะรันddคำสั่งคำสั่งจะlsblkส่งคืนผลลัพธ์ด้านล่าง: NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 931.5G 0 disk คำสั่งdd if=/dev/urandom of=/dev/sda conv=fsync status=progressถูกเรียกใช้ อุปกรณ์สูญเสียพลังงานและปิดเครื่อง เมื่อไฟฟ้าถูกเรียกคืนคำสั่งlsblkจะส่งคืนเอาต์พุตต่อไปนี้: NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 931.5G 0 disk sda2 8:2 0 487.5G 0 disk
11 partition  dd  lsblk 

2
เหตุใดฉันจึงไม่สามารถใช้ตัวแปรเป็นคำนำหน้าให้กับคำสั่งเพื่อตั้งค่าตัวแปรสภาพแวดล้อมได้
โดยปกติแล้วมันเป็นไปได้ที่จะตั้งค่าตัวแปรสภาพแวดล้อมสำหรับคำสั่งโดยนำหน้ามันเช่น: hello=hi bash -c 'echo $hello' ฉันรู้ด้วยว่าเราสามารถใช้ตัวแปรเพื่อทดแทนส่วนใดส่วนหนึ่งของการเรียกใช้คำสั่งดังนี้: $ cmd=bash $ $cmd -c "echo hi" # equivalent to bash -c "echo hi" ฉันประหลาดใจมากที่พบว่าคุณไม่สามารถใช้ตัวแปรเพื่อนำหน้าคำสั่งเพื่อตั้งค่าตัวแปรสภาพแวดล้อม กรณีทดสอบ: $ prefix=hello=hi $ echo $prefix # prints hello=hi $ $prefix bash -c 'echo $hello' hello=hi: command not found เหตุใดฉันจึงไม่สามารถตั้งค่าตัวแปรสภาพแวดล้อมโดยใช้ตัวแปรได้ ส่วนนำหน้าเป็นส่วนพิเศษหรือไม่? ฉันสามารถทำให้มันทำงานได้โดยใช้ eval ข้างหน้า แต่ฉันก็ยังไม่เข้าใจว่าทำไม ฉันใช้ทุบตี 4.4

3
ฉันจะสร้างข้อโต้แย้งไปยังคำสั่งอื่นผ่านการทดแทนคำสั่งได้อย่างไร
ติดตามจาก: พฤติกรรมที่ไม่คาดคิดในการทดแทนคำสั่งเชลล์ ฉันมีคำสั่งที่สามารถใช้รายการของการขัดแย้งขนาดใหญ่ซึ่งบางอย่างสามารถมีช่องว่างที่ถูกต้องตามกฎหมาย (และอาจเป็นอย่างอื่น) ฉันเขียนสคริปต์ที่สามารถสร้างข้อโต้แย้งเหล่านั้นสำหรับฉันด้วยเครื่องหมายคำพูด แต่ฉันต้องคัดลอกและวางผลลัพธ์เช่น ./somecommand <output on stdout with quoting> ./othercommand some_args <output from above> ฉันพยายามทำให้เพรียวบางนี้โดยทำ ./othercommand $(./somecommand) และพบพฤติกรรมที่ไม่คาดคิดตามที่กล่าวถึงข้างต้น คำถามคือ - สามารถใช้การทดแทนคำสั่งได้อย่างน่าเชื่อถือในการสร้างอาร์กิวเมนต์เพื่อothercommandให้ข้อโต้แย้งบางอย่างจำเป็นต้องมีการเสนอราคาและสิ่งนี้ไม่สามารถเปลี่ยนแปลงได้?

2
เคอร์เซอร์หายไปเมื่อใช้งาน `top -n1 | head`
เมื่อวิ่ง top -n1 | head เคอร์เซอร์ของเทอร์มินัลจะหายไป วิ่งtop -n1นำมันกลับมา ทดสอบในgnome-terminalและtilixใน Ubuntu 16.04 และ CentOS 7.5 การทำงานtop -n1 | tailไม่มีปัญหานี้ดังนั้นฉันจึงคิดว่ามีบางอย่างที่ส่วนท้ายของtopผลลัพธ์ให้เคอร์เซอร์ปรากฏขึ้นอีกครั้งซึ่งไม่ได้ถูกเรียกใช้งานเมื่อทำการพิมพ์headเพียงอย่างเดียว อะไรทำให้เกิดสิ่งนี้และฉันจะกลับเคอร์เซอร์ได้อย่างสวยงามยิ่งขึ้นได้อย่างไร

3
กระบวนการ superuser สามารถเปลี่ยน ID ผู้ใช้จริงและ ID กลุ่มของกระบวนการไม่ตรงกับในไฟล์รหัสผ่าน?
จาก APUE ID ผู้ใช้จริงและ ID กลุ่มจริงของกระบวนการระบุว่าเราเป็นใคร ทั้งสองฟิลด์นี้นำมาจากรายการของเราในรหัสผ่านเมื่อเราเข้าสู่ระบบโดยปกติค่าเหล่านี้จะไม่เปลี่ยนแปลงในระหว่างการเข้าสู่ระบบแม้ว่าจะมีวิธีสำหรับ กระบวนการ superuser ในการเปลี่ยน กระบวนการ superuser สามารถเปลี่ยน ID ผู้ใช้จริงและ ID กลุ่มจริงของกระบวนการดังนั้นความสัมพันธ์ระหว่าง ID ผู้ใช้จริงและ ID กลุ่มจริงไม่ตรงกับที่อยู่ในไฟล์รหัสผ่านหรือไม่ ตัวอย่างเช่นหากผู้ใช้Timไม่ได้เป็นสมาชิกของกลุ่มoceanต่อไฟล์รหัสผ่านกระบวนการ superuser สามารถเปลี่ยน ID ผู้ใช้จริงและ ID กลุ่มจริงของกระบวนการเป็นTimและoceanตามลำดับได้หรือไม่?
11 linux  users  group 

3
แทร็บ 'Ctrl + c' สำหรับสคริปต์ทุบตี แต่ไม่เปิดสำหรับกระบวนการในสคริปต์นี้
ฉันพยายามที่จะมีโปรแกรมแบบโต้ตอบในสคริปต์ทุบตี: my_program และฉันต้องการปิดด้วย 'Ctrl + c' แต่เมื่อฉันทำมันสคริปต์ของฉันก็ปิดเช่นกัน ฉันรู้เกี่ยวกับ trap '' 2 my_program trap 2 แต่ในกรณีนี้ฉันไม่สามารถปิดmy_programด้วย Ctrl + c คุณมีความคิดวิธีการอนุญาตให้ Ctrl + c ในโปรแกรม แต่ไม่ปิดสคริปต์ทำงานหรือไม่ แก้ไข: เพิ่มตัวอย่าง #!/bin/bash my_program my_program2 ถ้าฉันใช้ Ctrl + C เพื่อใกล้my_program, my_program2ไม่เคยดำเนินการเพราะสคริปต์ทั้งหมดจะออก
11 bash  trap 

2
ทำไมเวลาไม่ถึงในคู่มือทุบตี GNU?
[fakename]$ help time time: time [-p] pipeline Report time consumed by pipeline's execution... จากนี้ดูเหมือนว่าtimeเป็น Bash builtin แต่ผมไม่สามารถหาคำอธิบายได้ในหน้าเว็บนี้: https://www.gnu.org/software/bash/manual/html_node/Shell-Builtin-Commands.html#Shell-Builtin-Commands เหตุใดจึงเป็นเช่นนี้
11 bash  man  time 

4
วิธีที่จะทำให้การค้นหาสตริงด้วยคำสั่ง grep เป็นคำสั่ง if?
ฉันต้องการค้นหาหลายสายในสองไฟล์ หากพบหนึ่งสตริงในไฟล์ทั้งสองให้สร้างบางอย่าง หากพบหนึ่งสตริงในไฟล์เดียวให้สร้างอีกอย่าง คำสั่งของฉันคือต่อไป: ####This is for the affirmative sentence in both files if grep -qw "$users" "$file1" && grep -qw "$users" "$file2"; then ####This is for the affirmative sentence in only one file, and negative for the other one if grep -qw "$users" "$file1" ! grep -qw "$users" "$file2"; …

1
Bash มีปัญหาประสิทธิภาพการทำงานโดยใช้รายการอาร์กิวเมนต์?
แก้ไขในทุบตี 5.0 พื้นหลัง สำหรับพื้นหลัง (และความเข้าใจ (และพยายามหลีกเลี่ยง downvotes คำถามนี้ดูเหมือนจะดึงดูด)) ฉันจะอธิบายเส้นทางที่พาฉันไปที่ปัญหานี้ (ดีที่สุดที่ฉันจำได้ในสองเดือนต่อมา) สมมติว่าคุณทำการทดสอบเชลล์สำหรับรายการอักขระ Unicode: printf "$(printf '\\U%x ' {33..200})" และมีอักขระ Unicode มากกว่า 1 ล้านตัวการทดสอบ 20,000 ตัวนั้นดูเหมือนจะไม่มาก นอกจากนี้สมมติว่าคุณตั้งค่าอักขระเป็นอาร์กิวเมนต์ตำแหน่ง: set -- $(printf "$(printf '\\U%x ' {33..20000})") ด้วยความตั้งใจที่จะส่งผ่านตัวละครไปยังแต่ละฟังก์ชั่นเพื่อประมวลผลพวกเขาในรูปแบบที่แตกต่างกัน ดังนั้นฟังก์ชั่นควรมีรูปแบบtest1 "$@"หรือคล้ายกัน ตอนนี้ฉันรู้แล้วว่าความคิดนี้เลวร้ายแค่ไหน ทีนี้สมมติว่าจำเป็นต้องใช้เวลา (n = 1,000) แต่ละวิธีแก้ปัญหาเพื่อค้นหาว่าดีกว่าภายใต้เงื่อนไขเช่นนี้คุณจะจบลงด้วยโครงสร้างที่คล้ายกับ: #!/bin/bash -- TIMEFORMAT='real: %R' # '%R %U %S' set …
11 linux  bash  time 

3
ทำการทดสอบ -nt / -ot ใน POSIX sh
บิวด์อินtestและ[ยูทิลิตีมีการทดสอบ-nt("ใหม่กว่า") และ-ot("เก่ากว่า") ในเชลล์ส่วนใหญ่แม้ว่าเชลล์จะทำงานใน "โหมด POSIX" (เช่นเดียวกับยูทิลิตี้ภายนอกของชื่อเดียวกันบน ระบบที่ฉันสามารถเข้าถึงได้) การทดสอบเหล่านี้ใช้สำหรับการเปรียบเทียบการประทับเวลาการปรับเปลี่ยนในสองไฟล์ เอกสารความหมายของพวกเขาจะแตกต่างกันเล็กน้อยในการใช้งาน (โดยคำนึงถึงสิ่งที่เกิดขึ้นหากไฟล์หนึ่งหรือไฟล์อื่นที่ไม่ได้อยู่) แต่พวกเขาจะไม่รวมอยู่ในข้อมูลจำเพาะ POSIX สำหรับtestยูทิลิตี้ พวกเขาจะไม่ถูกพาไปข้างหน้าในtestยูทิลิตี้เมื่อคำสั่งแบบมีเงื่อนไขถูกลบออกจากเปลือก [KornShell] เพราะพวกเขาไม่ได้รวมอยู่ในtestยูทิลิตี้ที่มีอยู่ในการติดตั้งในอดีตของshยูทิลิตี้ สมมติว่าฉันต้องการเปรียบเทียบการประทับเวลาการปรับเปลี่ยนระหว่างไฟล์ใน/bin/shเชลล์สคริปต์แล้วดำเนินการขึ้นอยู่กับว่าไฟล์หนึ่งใหม่กว่าอีกไฟล์หนึ่งดังเช่นใน if [ "$sigfile" -nt "$timestamp" ] || [ "$sigfile.tmp" -nt "$timestamp" ] then return fi ... ยูทิลิตี้อื่น ๆ ที่ฉันสามารถใช้นอกเหนือจากmake(ซึ่งจะทำให้สคริปต์ที่เหลือไม่ได้พูดอย่างน้อยที่สุด) หรือฉันควรจะสมมติว่าไม่มีใครที่จะเรียกใช้สคริปต์ใน "การดำเนินการทางประวัติศาสตร์ของsh" หรือลาออกเพื่อเขียนเปลือกเฉพาะเช่นbash?
11 files  timestamps  posix  test 

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