표준 명령에 대한 별칭이 권장되지 않는 이유는 무엇입니까?


19

예를 들어, ~/.bashrc파일 또는 이와 동등한 파일 에서 본 공통 별칭 은

alias rm='rm -i'

그러나 사람들이 이것에 대해 추천하는 것을 보았습니다.

  1. 별칭이 다른 시스템에 존재하지 않을 수 있으며을 (를 rm) 부주의하게 만들었으므로 실수로 중요한 것을 삭제했습니다. [1]
  2. 이 별칭을 사용하면 사실상 모든 명령 을 입력 y하거나 입력 yes한 후에 rm전체 목표를 무너 뜨릴 수 있습니다.

이것에 대해 추천 할 다른 이유가 있습니까? 일부 프로그램은 단순히 rm대신에 전화를 걸 \rm수 있으며, 그에 대한 앨리어싱으로 인해 문제가 발생할 수 있습니까?

내가 사용하는 rm예로서 간단하게,하지만 난 같은 다른 명령을 본 적이 cpmv뿐만 아니라 별칭에 의해 덮여. 개인적으로 다음과 같은 별칭을 사용하도록 천천히 훈련하고 있습니다 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

귀하의 질문은 기존 명령에 대한 앨리어싱과 관련된 대부분의 일반적인 관심사를 다루며, 가장 중요한 것은 언뜻보기에 익숙하지 않은 환경이 잠재적으로 매우 다른 결과를 낳을 수 있다는 것입니다. 예를 들어, 앨리어싱 rm을하는 것은 rm -i좋은 의도를 가지고 있지만 상태 이유로 실제로 나쁘다.


7

"이것에 대해 추천 할 다른 이유가 있습니까?"

물론이야:

(3) 언젠가는 [-----------]에 의해 세워진 기초 와 앨리어싱 표준 명령이 표준이지만 앨리어싱 표준 명령을 위해 다른 사람들을 추격하는 편집증 사람들에게 추가하기를 희망하기 때문에 .

진지하게, 이것들은 단지 경고입니다. 당신이 그 운명의 구덩이에 빠지지 않도록 자신을 신뢰한다면, 그냥 조심하고 계속하십시오.

개인적으로 나는 표준 명령을 거의 사용하지 않습니다. 나는 약간의 편집증과 항문 유지력이기 때문에 약간의 변형을 사용합니다. 그러나 내가 이것을 찾은 좋은 용도는 종종 루트 또는 다른 사용자로 로그인하는 시스템과 관련이 있으며 실수로 / 게으르게 루트로 실행하고 싶지 않은 몇 가지 사항이 있습니다.

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

또는

alias irc="su irc_user"

4

극단적 인 예로, 표준 명령의 별칭을 지정하는 것이 왜 해로운 지 설명하기 위해 표준 명령의 별칭을 지정하겠습니다.

alias ls='rm'

분명히 이것은 언젠가는 끔찍한 놀라움을 일으킬 것이기 때문에 나쁘다. 마찬가지로 표준 명령을 별칭으로 바꾸면 결국 예상치 못한 불행한 결과를 초래할 수 있습니다.

그러나 거의 모든 유닉스 관리자들이 커리어가 발전함에 따라 일어날 일반적인 시나리오를 제시하겠습니다.

언젠가는 새로운 일을 시작하고 다른 사람들이 세운 새로운 시스템에서 일하게 될 것입니다. 토요일 오전 3시에 시작될 것입니다. 당신은 똑바로 생각하지 않고 실수를 저지르기 쉽습니다. 표준 환경을 사용할 수 없습니다. 사실, 당신은 뿌리입니다.

이것을 감안할 때, 당신 rm은 그것이 별칭이 아닌 것을 기억할 것 rm -i입니까? 상자에 로그인 할 때마다 특수한 별칭을 확인 하시겠습니까? 루트의 환경을 바꾸면 동료가 변화에 만족할 것입니까?

나는 이것에 대해 정직하게 울타리에 있습니다. 저는 경력에 따라 수천 대의 시스템을 연구했으며 이러한 모든 시스템에서 환경을 수정 한 경우 그 가치를 파악하기가 어렵습니다.

앨리어싱 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것이 10 개의 별칭을 기억하는 것보다 더 편리 할 수 ​​있습니다.
Bernhard

매우 사실입니다. 사실, 나는 더 이상이 별명을 거의 사용하지 않습니다. 왜 내가 여전히 그것들을 가지고 있는지 잘 모르겠습니다. 다른 복잡한 앨리어스 (및 함수)는 알아 내기 어렵고 참조하기에 좋습니다. 간단히하기 위해 아마도 제거해야합니다.
Stefan Lasiewski

"일러스트"(첫 번째 예)는 실제로 유용하지 않습니다. 그것은 분명히 악의적이며 우리는 시스템을 부비 트래핑하는 것이 해로울 수 있다는 것을 알고 있습니다. 귀하의 rm-> rm -i예가 훨씬 좋습니다. 또 다른 좋은 방법은 별칭을 사용하여 rm에 별명을 지정하는 것입니다.~/.trash
derobert

1
@Bernhard : True이지만 별칭은 더 빨리 입력 할 수 있습니다. (하지만 10은 너무 많지 않습니다.)
Emanuel Berg

2
@StefanLasiewski : 힌트 : 순수한 미학적 이유로 표시되지 않는 것을 제거하지 마십시오. 그들이 당신을 적극적으로 방해하지 않는 한 그대로 두십시오. 설정 시간을 소비 한 후 물건을 제거하는 것은 빠른 행동입니다. 당신이 그것을 후회한다면, 당신은 단지 그들을 내버려 두는 것에 대한 바보 같은 느낌이 든다.
Emanuel Berg

4

더 많은 위험이 있습니다.

예를 들어, shell-commandEmacs에서 사용하는 경우 "your"명령 (또는 alias ) 을 얻는다고 생각할 수 있지만, ls별칭 설정에 대한 모든 것을 잊어 버리기 전에 터미널에서 별칭을 여러 번 누르지 않아도됩니다. 다른 명령으로 ...)-실제로 (Emacs로 돌아 가기), (unaliased) 명령을 얻습니다. 이맥스는 문제없이 그것을 실행할 것이므로, 당신은 방금 일어난 일에 눈이 멀 수도 있습니다!

다른 컴퓨터 및 / 또는 시스템의 경우 개별 .rc파일을 모두 설정하기가 너무 지루하다고 생각되면 그러한 파일을 하나만 가질 수 있지만 if맞춤 절이 있습니다.

예를 들어, 각 함수를 작성할 때 각 함수를 평가하는 대신 문제가 발생할 때마다 "블랙리스트"에 마지막으로 추가하십시오.

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

3

별명 (예 :) 항목으로 표준 명령의 이름을 바꾸면rm=rm -i 별명을 사용할 수없는 경우가 발생할 수 있습니다. I는 사용하지 선호하고, (여러 쓴, 쓰라린 경험에 의해 ;-) 나는 두 번 각 명령을 읽는 acustomed 될 것, 그리고 그것의 경우 rmmv또는 다른 어떤 잠재적으로 파괴적인 세 번. 그리고 이러한 별칭은 자동 "rm foo"ENTER "y" 죄송합니다! 어쨌든 (그리고 매번 추가 키를 누르십시오).

그러나 그것은 단지 나입니다. 외계 환경 (다른 기계, 다른 사용자 등)에서 실행이 예상되지 않고 어디에서나 즐겨 찾는 별명을 설치할 수 있다면 열광하십시오. 유닉스는 사용자에게 자신의 발을 쏠 수있는 충분한 밧줄 이상을 제공하는 것으로 유명합니다.


0

다른 답변은 좋지만 모두 그것이 당신에게 어떤 영향을 미치는지 살펴 봅니다.

@Stephan Laswieski의 대답을 머리로 돌리겠습니다.

전능하지 않다고 가정하면 다른 사람이 사용자 계정에서 작업하도록하거나 무언가를 수행하는 방법에 대해 조언해야 할 수도 있습니다.

그런 다음 그들이 무언가를하거나 지시를하면 예상대로 작동하지 않을 수 있습니다.

기껏해야 그들에게 무슨 일이 있었는지 설명하는 데 시간을 낭비해야 할 것입니다.

최악의 경우, 다른 답변 중 하나 인 alias ls = 'rm -rf'에서 예제를 살펴보십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.