ฉันสามารถทำให้อินเทอร์แอคทีฟได้เฉพาะเมื่อใช้ globbing หรือไม่ (ใน bash หรือ zsh หรือทั้งสองอย่าง)


15

เมื่อใดก็ตามที่ฉันมีrmหลายรายการพร้อม ๆ กันกับที่มีเปลือกหอยกลมและมีความเป็นไปได้แม้แต่น้อยที่สุดที่รูปแบบขยายออกไปมากกว่าที่ฉันคาดไว้ฉันพยายามจำไว้เสมอว่าจะเพิ่ม-iแต่แน่นอนฉันสามารถลืมและระเบิดสิ่งที่มีประโยชน์ บางคนพยายามที่จะแก้ปัญหานี้ด้วยนามแฝงเช่นalias rm='rm -i'แต่ฉันเกลียดความคิดในการสร้าง rm แบบอินเทอร์แอคทีฟเสมอเพราะจากนั้นฉันจะใช้นิสัย-fตลอดเวลาซึ่งจะเอาชนะวัตถุประสงค์ทั้งหมดอย่างเห็นได้ชัด

สิ่งที่ผมอยากจะทำคือให้rmใช้เฉพาะ-iเมื่อฉันใช้ globbing และ-fแน่นอนที่จะแทนที่ดังนั้นฉันยังคงสามารถระเบิดไดเรกทอรีออกไปทั้งที่มีตามปกติ-irm -rf junk

ดังนั้นrm *blah*จริงๆจะเป็นrm -i *blah*แต่rm blahจะทำงานตรงตามที่พิมพ์

ในกรณีที่มีความแตกต่างในวิธีการที่จะประสบความสำเร็จในเปลือกหอยที่แตกต่างกันฉันจะเลือกคำตอบที่ให้วิธีการสำหรับทั้ง bash และ zsh มากกว่าคำตอบที่ครอบคลุมอย่างใดอย่างหนึ่งเท่านั้น


หมายเหตุ : ฉันไม่เชื่อจริง ๆ ว่านี่เป็นความคิดที่ดี ฉันแค่ถามว่ามันเป็นไปได้ หากคุณคิดว่านี่เป็นความคิดที่โง่ฉันจะมีความสุขมากที่จะได้ยินเหตุผลที่อยู่เบื้องหลังความคิดเห็นของคุณ แต่โปรดอย่าแสดงความคิดเห็นไม่ได้โพสต์ดังกล่าวในฟิลด์คำตอบ คำตอบจริง ๆ บอกฉันว่าจะทำอย่างไรหรืออธิบายว่า / ทำไมจึงเป็นไปไม่ได้ (หรืออาจเสนอวิธีอื่นในการรับผลลัพธ์ที่คล้ายกัน) แต่ถ้าคุณต้องการที่จะบอกฉันว่าทำไมนี้เป็นใบ้กรุณาโพสต์เป็นความคิดเห็น ฉันจะลบล้างความคิดเห็นที่มีเหตุผลแม้ว่าฉันจะไม่เห็นด้วยกับข้อสรุปก็ตาม


7
ข้อเสนอแนะเล็กน้อย: ด้วยยูทิลิตี้ GNU rm -Iก็เป็นเช่น-iนั้นจะทริกเกอร์เมื่อมากกว่าสามไฟล์หรือ-rผ่าน ในbashใช้Ctrl-x *แป้นพิมพ์ลัดเพื่อขยาย glob และตรวจสอบด้วยตัวคุณเอง
jw013

2
ด้วยการทุบตีฉันเชื่อว่าคำตอบคือ "ไม่" ด้วย zsh คุณอาจจะสามารถใช้ประโยชน์จากnoglobโดยใช้นามแฝง rm ถึงnoglob my-rmแล้วมี my-rm เป็นสคริปต์ที่ตรวจสอบ glob ขยายและผ่าน -i หรือไม่ ไม่แน่ใจไม่ทราบ zsh
Derobert

@derobert: คุณฟังดูเหมือนว่าคุณรู้จัก zsh อยู่ดี
iconoclast

@iconoclast Nope ไม่ใช่ zsh เพียง Google ผิดปกติฉันพบว่าเมื่อพยายามหาวิธีที่จะทำในทุบตี :-P
derobert

หากคุณต้องการบางสิ่งที่ดูเหมือน rm แต่ใช้งานได้จริงฉันควรเขียนสคริปต์ (หรือชื่อแทน / ฟังก์ชัน / ฟังก์ชั่นคีย์) ที่เรียกmyrmแล้วปล่อยให้สคริปต์นั้นทำสิ่งที่คุณชอบ
วอลเตอร์

คำตอบ:


9

มันไม่ง่าย. ปัญหาคือเมื่อคุณทำ:

rm -- *.txt

rm เพิ่งเห็นรายการของไฟล์ไม่ใช่รูปแบบการวนรอบซึ่งถูกขยายโดยเชลล์

สิ่งที่คุณสามารถทำได้คือ (zsh):

alias rm='noglob rm'

สิ่งนี้บอก zsh ว่ารูปแบบไม่ควรถูกขยายเมื่อเรียก rm จากนั้นคุณสามารถกำหนด rm ใหม่เป็นฟังก์ชั่นที่ทำการขยายตัวเองและเพิ่ม "-i" หากจำเป็นต้องมีลักษณะดังนี้:

'rm'() {
  [[ "$*" = *[*[?]* ]] && set -- -i "$@"
  command rm $~@
}

ปัญหาเกี่ยวกับวิธีการนั้นคือ "rm" ใหม่นี้ไม่เห็นความแตกต่างระหว่าง

rm *

และ

rm '*'

ในการลบไฟล์ที่เรียกว่า*คุณจะต้องเขียนมัน:

rm [*]

-1

ทำงานในทุบตีอาจอยู่ในเปลือกหอยอื่น ๆ สถานที่ในของคุณ.bashrc

function rm() { 
  while test "${1:0:1}" = "-"; do 
    shift
  done
  if test $# -eq 1; then 
    command rm "$1"
  else 
    command rm -i "$@"
  fi
}

3
คุณสามารถใช้เพื่อหลีกเลี่ยงการเข้ารหัสที่ยากcommand rm PATHนอกจากนี้วิธีการตรวจสอบจำนวนอาร์กิวเมนต์เป็นบิตที่ไม่น่าเชื่อถือเช่นเดียวกับที่rmสามารถใช้ตัวเลือก
jw013

1
ควรเสนอราคา "$ 1" มิเช่นนั้นจะล้มเหลวหากไฟล์เดียวที่ส่งผ่านมีช่องว่าง @ jw013 - นอกจากนี้คุณยังสามารถหลบหนีจากคำสั่งเช่น\rm
jordanm

@jordanm คุณถูกต้องเกี่ยวกับความต้องการที่จะพูด$1ด้วยคำพูดสองครั้ง แต่ผิดเกี่ยวกับการหลบหนีคำสั่ง การอ้างอิงเพียงแค่ระงับนามแฝงไม่ใช่ฟังก์ชันค้นหา คำตอบนี้เป็นการแนะนำฟังก์ชั่นไม่ใช่นามแฝง
jw013

1
อย่างน้อยการแก้ไขแบบเก่าก็ใช้งานได้ - การแก้ไขใหม่จะยกเลิกตัวเลือกบรรทัดคำสั่งของผู้ใช้ซึ่งอาจไม่ใช่สิ่งที่ถูกต้อง
jw013

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