เหตุใดจึงไม่แนะนำให้ใช้นามแฝงเหนือคำสั่งมาตรฐาน


19

ตัวอย่างเช่นนามแฝงทั่วไปที่ฉันเคยเห็นใน~/.bashrcไฟล์ (หรือเทียบเท่า) คือ

alias rm='rm -i'

อย่างไรก็ตามฉันเคยเห็นคนแนะนำเรื่องนี้เพราะ

  1. นามแฝงอาจไม่มีอยู่ในระบบอื่นและเนื่องจากคุณไม่ประมาทrmคุณจะลบสิ่งที่สำคัญโดยไม่ได้ตั้งใจ [1]
  2. โดยการใช้นามแฝงนี้คุณจะฝึกตัวเองให้พิมพ์yหรือyesตามrmคำสั่งทุกคำสั่งซึ่งเอาชนะวัตถุประสงค์ทั้งหมด

มีเหตุผลอื่นอีกไหมที่แนะนำเรื่องนี้? อาจมีบางโปรแกรมที่โทรไปหาrmแทนที่จะใช้ชื่อแทน\rmอาจทำให้เกิดปัญหาได้

ฉันใช้rmเป็นเพียงตัวอย่าง แต่ฉันเห็นคำสั่งอื่น ๆ เช่นcpหรือmvครอบคลุมโดยนามแฝงเช่นกัน โดยส่วนตัวฉันค่อย ๆ ฝึกฝนตัวเองให้ใช้นามแฝงแบบนี้แทนrm -i:

alias trash=`mv -v -t $HOME/.Trash`

3
ทุกครั้งที่ฉันเดินทางข้ามระบบที่มีนามแฝงเริ่มต้นระบบrm -iจะฝึกให้ฉันเพิ่มอีกเล็กน้อยเพื่อเพิ่มการ-fตั้งค่าสถานะโดยอัตโนมัติ
Jander

คุณสามารถตั้งชื่อแทนrm -iสิ่งที่คุณต้องการ เช่นdel, irmฯลฯ คุณไม่จำเป็นต้องrmไปยังนามแฝงมัน สิ่งที่หลีกเลี่ยงจุดนี้ 1 และโดยการเลือกใช้delหรือrmขึ้นอยู่กับสิ่งที่คุณต้องการคุณยังหลีกเลี่ยงจุด 2 ถึงระดับ
Martin Tournoij

คำตอบ:


8

สมมติว่าคุณกำลังใช้ bash นี่ไม่ควรทำให้เกิดปัญหากับสคริปต์เนื่องจากเชลล์ bash ที่ไม่มีการโต้ตอบไม่ได้มา~/.bashrcหรือ~/.bash_profile(ซึ่งน่าจะเป็นที่ที่วางชื่อแทนของคุณหรือเป็นขั้นตอนแรกในการจัดหาชื่อแทนของคุณในสคริปต์อื่น) . อย่างไรก็ตามอาจทำให้เกิดปัญหาหากคุณกำลังหาสคริปต์:

$ alias echo='command echo foo'
$ cat > script << 'EOF'
> #!/bin/bash
> echo bar
> EOF
$ chmod a+x script
$ ./script
bar
$ . ./script
foo bar

คำถามของคุณครอบคลุมข้อกังวลทั่วไปส่วนใหญ่เกี่ยวกับการใช้นามแฝงเหนือคำสั่งที่มีอยู่สิ่งสำคัญคือสภาพแวดล้อมที่ไม่คุ้นเคยซึ่งปรากฏขึ้นอย่างรวดเร็วในครั้งแรกว่าเหมือนกันอาจทำให้ได้ผลลัพธ์ที่แตกต่างกัน ยกตัวอย่างเช่น aliasing rmจะrm -iมีความตั้งใจที่ดี แต่ไม่ดีในทางปฏิบัติด้วยเหตุผลที่คุณรัฐ


7

"มีเหตุผลอื่นอีกไหมที่แนะนำเรื่องนี้?"

แน่นอน:

(3) เพราะวันหนึ่งฉันหวังว่าจะเพิ่มไปยังฐานรากที่สร้างโดย[-----------]และคนหวาดระแวงที่ตีสอนผู้อื่นเพื่อให้นามแฝงคำสั่งมาตรฐานแม้ว่านามแฝงมาตรฐานคือมาตรฐานที่ดี .

อย่างจริงจังแม้ว่าเหล่านี้เป็นเพียงคำเตือน หากคุณเชื่อมั่นในตัวเองว่าจะไม่ตกอยู่ในหลุมแห่งการลงโทษใด ๆ จงระวังและทำต่อไป

โดยส่วนตัวแล้วฉันใช้คำสั่งมาตรฐานน้อยมาก ฉันใช้การเปลี่ยนแปลงเล็กน้อยเพราะฉันเป็นเพียงเล็กน้อยหวาดระแวงและการตอบโต้ทางทวารหนัก แต่การใช้งานที่ดีอย่างหนึ่งที่ฉันพบในเรื่องนี้คือเกี่ยวกับระบบที่ฉันมักจะเข้าสู่ระบบในฐานะผู้ใช้รูทหรือผู้ใช้รายอื่นและมีบางสิ่งที่ฉันไม่ต้องการให้ทำงานโดยบังเอิญ / ขี้เกียจในฐานะรูท:

alias irc="echo \"No you don't!\""

หรือ

alias irc="su irc_user"

4

เป็นตัวอย่างที่ดีที่สุดขอให้ฉันใช้นามแฝงคำสั่งมาตรฐานเพื่อแสดงให้เห็นว่าทำไมการนามแฝงคำสั่งมาตรฐานอาจเป็นอันตราย:

alias ls='rm'

เห็นได้ชัดว่านี่เป็นสิ่งที่ไม่ดีเพราะมันจะทำให้แปลกใจที่น่ารังเกียจบางวัน ในทำนองเดียวกันการแทนที่คำสั่งมาตรฐานด้วยนามแฝงในที่สุดก็จะนำไปสู่ความประหลาดใจที่โชคร้ายเมื่อคุณคาดหวังมันน้อยที่สุด

แต่ให้ฉันนำเสนอสถานการณ์ทั่วไปที่จะเกิดขึ้นกับผู้ดูแลระบบ Unix เกือบทุกคนในขณะที่พวกเขาก้าวหน้าในอาชีพของพวกเขา:

สักวันหนึ่งในอนาคตคุณจะเริ่มงานใหม่และจะทำงานกับระบบใหม่ที่คนอื่นตั้งขึ้นมา มันจะเป็นสามนาฬิกาในตอนเช้าของวันเสาร์และคุณไม่ได้คิดอะไรและมีแนวโน้มที่จะทำผิดพลาด สภาพแวดล้อมมาตรฐานของคุณจะไม่สามารถใช้ได้ ในความเป็นจริงคุณเป็นรากฐาน

รับสิ่งนี้คุณจะจำrmได้rm -iไหมว่าไม่ได้ใช้นามแฝง? คุณจะตรวจสอบนามแฝงพิเศษของคุณทุกครั้งที่คุณลงชื่อเข้าใช้ในช่อง? หากคุณเปลี่ยนสภาพแวดล้อมของรูทเพื่อนร่วมงานของคุณจะมีความสุขกับการเปลี่ยนแปลงของคุณหรือไม่

ฉันซื่อสัตย์กับรั้วเกี่ยวกับเรื่องนี้ ฉันทำงานกับระบบหลายพันระบบในอาชีพการงานของฉันและถ้าฉันปรับเปลี่ยนสภาพแวดล้อมในระบบเหล่านี้ทั้งหมดมันคงยากที่จะเห็นคุณค่า

aliasing rmจะrm -iเป็นเรื่องธรรมดามากและผมได้เห็นมันป้องกันปัญหาต่าง ๆ แต่ก็ยังได้ก่อให้เกิดความผิดจำนวนมากและชั่วโมงการทำงานพิเศษในการกู้คืนไฟล์ที่ถูกลบโดยไม่ตั้งใจ

ดังนั้นตอนนี้ฉันพยายามหลีกเลี่ยงการสร้างสมนามคำสั่งระบบทั่วไป แต่ฉันใช้นามแฝงและฟังก์ชั่นในการทำสิ่งต่าง ๆ ซึ่งเชลล์ไม่สามารถทำได้อย่างง่ายดาย สิ่งที่ฉันมักจะทำตอนนี้คือแนบจดหมายพิเศษกับนามแฝงเช่น:

# List long, with color or special characters, depending on OS
alias  ll='ls -l'
# Long, with metacharacters, show dotfiles, don't show . and ..
alias lll='ls -lA'
# Long, with metacharacters, show dotfiles, show . and ..
alias lla='ls -la'
# List just the dotfiles
alias  l.='ls -l -Ad .????*'

# Useful greps
#alias hgrep='history |grep ${*} |grep -v $$'
alias greph='history |grep ${*}'
alias grepp='ps -ef |grep ${*}'

### Highlight some text.
# From http://unix.stackexchange.com/questions/366/convince-grep-to-output-all-lines-not-just-those-with-matches/367#367
highlight () { grep --color -E "$1|$" $2 ; }

และบางทีฉันควรกำจัดนามแฝงสุดท้ายของฉันเพราะการปรับตัวให้เข้ากับแนวทางปฏิบัติใหม่ต้องใช้เวลา:

# For safety!
alias rm='rm -i'

8
การจดจำค่าสถานะสำหรับlsอาจสะดวกกว่าการจดจำชื่อแทนสิบรายการ
Bernhard

จริงแท้แน่นอน. ที่จริงแล้วฉันไม่ค่อยใช้นามแฝงเหล่านี้อีกแล้ว ฉันไม่แน่ใจว่าทำไมฉันจึงยังมีพวกเขาอยู่นอกจากนั้นนามแฝงที่ซับซ้อนมากขึ้น (และฟังก์ชั่น) ก็ยากที่จะคิดออกและดีสำหรับการอ้างอิง เพื่อความเรียบง่ายฉันอาจจะลบมันออก
Stefan Lasiewski

"ภาพประกอบ" (ตัวอย่างแรก) ไม่มีประโยชน์จริงๆ นั่นเป็นอันตรายอย่างชัดเจนและเรารู้ว่าระบบที่ติดกับดักอาจเป็นอันตรายได้ ตัวอย่างrm-> ของคุณrm -iดีกว่ามาก สิ่งที่ดีอีกอย่างหนึ่งก็คือสิ่งที่นามแฝงที่จะนำสิ่งต่าง ๆ ใน~/.trash
Derobert

1
@Bernhard: จริง แต่นามแฝงพิมพ์ได้เร็วกว่า (แต่สิบมีมากเกินไปโดยไม่คำนึงถึง)
Emanuel Berg

2
@StefanLasiewski: คำแนะนำ: อย่าลบสิ่งที่ไม่แสดงด้วยเหตุผลด้านความงามอย่างหมดจด ปล่อยให้พวกเขาอยู่เว้นแต่พวกเขารบกวนคุณอย่างแข็งขัน มันเป็นการกระทำที่รวดเร็วในการลบสิ่งต่าง ๆ หลังจากใช้เวลาตั้งค่าชั่วโมง; และถ้าคุณรู้สึกเสียใจคุณจะรู้สึกเหมือนเป็นคนงี่เง่าที่ไม่เพียง แต่ปล่อยให้เป็นแบบนั้น
Emanuel Berg

4

มีอันตรายมากกว่านั้น

ตัวอย่างเช่นหากคุณใช้shell-commandใน Emacs คุณอาจคิดว่าคุณได้รับคำสั่ง "ของคุณ" (หรือนามแฝงแต่คุณไม่จำเป็นต้องกดlsนามแฝงในเทอร์มินัลหลายครั้งก่อนที่คุณจะลืมเรื่องการตั้งค่านามแฝง มันเป็นคำสั่งอื่น ๆ ... ) - อันที่จริง (กลับไปที่ Emacs) คุณจะได้รับคำสั่ง (ไม่รวม) Emacs จะทำงานได้โดยไม่มีปัญหาดังนั้นคุณอาจจะตาบอดในสิ่งที่เพิ่งเกิดขึ้น!

สำหรับคอมพิวเตอร์และ / หรือระบบที่แตกต่างกันหากคุณคิดว่ามันน่าเบื่อเกินกว่าที่จะตั้งค่าแต่ละ.rcไฟล์สำหรับพวกเขาทั้งหมดคุณสามารถมีไฟล์ดังกล่าวได้เพียงไฟล์เดียว แต่มีifคำสั่งตัด

ตัวอย่างเช่นแทนที่จะประเมินแต่ละฟังก์ชั่นเมื่อคุณเขียนพวกเขาเพียงแค่คุณประสบปัญหากับพวกเขาเพิ่มลงใน "บัญชีดำ" สุดท้าย:

if [[ `uname` == "SunOS" ]]; then
  unset -f mic cpkeep mcp mcph cpindex cpconf # not for Solaris
fi

3

การเปลี่ยนชื่อคำสั่งมาตรฐานโดยนามแฝง (เช่นrm=rm -i) สิ่งต่าง ๆ อาจนำไปสู่การสร้างความแปลกใจในกรณีที่ไม่สามารถใช้ชื่อแทนได้ ฉันชอบที่จะไม่ใช้ดังกล่าวและ (โดยขมประสบการณ์ขมหลาย ;-) ฉันได้กลายเป็น acustomed กับการอ่านแต่ละคำสั่งสองครั้งและถ้ามันrmหรือmvหรือสิ่งอื่นใดที่อาจเกิดขึ้นสามครั้งทำลาย และชื่อแทนดังกล่าวจะนำไปสู่ ​​"rm foo" ENTER "y" อุ๊ปส์ !! อย่างไรก็ตาม (และค่าใช้จ่ายการกดปุ่มพิเศษแต่ละครั้ง)

แต่นั่นเป็นเพียงฉัน หากคุณไม่คาดหวังให้ทำงานในสภาพแวดล้อมของเอเลี่ยน (เครื่องอื่นผู้ใช้อื่น ... ) และคุณสามารถติดตั้งชื่อแทนที่คุณชื่นชอบไม่ว่าคุณจะอยู่ที่ไหน Unix เป็นที่รู้จักกันดีว่าให้ผู้ใช้มากกว่าเชือกพอที่จะยิงเท้าของตัวเอง


0

คำตอบอื่น ๆ เป็นสิ่งที่ดี แต่พวกเขาทั้งหมดเพียงดูว่ามันมีผลต่อคุณ

ให้ฉันหันคำตอบของ @Stephan Laswieski บนหัวเล็กน้อย

สมมติว่าคุณไม่ได้เป็นคนรอบรู้คุณอาจต้องให้คนอื่นทำงานกับบัญชีผู้ใช้ของคุณหรือแนะนำคุณเกี่ยวกับวิธีการทำบางสิ่งบางอย่าง

จากนั้นเมื่อพวกเขาทำอะไรหรือบอกให้คุณทำมันอาจไม่ทำงานอย่างที่คาดไว้

ที่ดีที่สุดคุณจะต้องเสียเวลาอธิบายสิ่งที่เกิดขึ้นกับพวกเขา (ถ้าคุณอยู่ที่นั่นและสามารถจำหรือคิดออกว่านามแฝงคือสาเหตุของปัญหา)

ที่แย่ที่สุดดูตัวอย่างจากคำตอบอย่างใดอย่างหนึ่ง: alias ls = 'rm -rf'

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