영구 Bash 별명을 작성하는 방법


381

rm이 명령을 실행 한 후 확인 메시지를 표시하기 위해 명령에 대한 별명을 작성하고 싶습니다 . 그래서 나는 이와 같은 별칭을 만들고 alias rm='rm -i'있습니다. 그러나 내가 아는 한 이것은 임시 별칭이며 터미널을 닫을 때까지 지속됩니다.

이 설명으로 여기에 영구적으로 별칭을 저장 나는 실행해야 ~/.bash_aliases또는 ~/.bashrc명령을 터미널에서 거기 내 별명을 추가합니다. 그러나 내가 실행할 때 ~/.bashrc다음과 같은 오류 메시지가 나타납니다.

bash: /home/bakhtiyor/.bashrc: Permission denied

실행할 때 다음 ~/.bash_aliases과 같은 또 다른 오류 메시지가 나타납니다.

bash: /home/bakhtiyor/.bash_aliases: File or directory doesn't exist.

실제 문제는 무엇이며 어떻게 해결할 수 있습니까?



alias rm='rm -i'rm 우연히 사용하는 문제를 해결하지 못함
qwr

답변:


428

별칭을 .bashrc파일에 영구적으로 추가하려면

gedit ~/.bashrc

그런 다음 하단에 별칭을 추가하십시오.

대체 텍스트

이제 . ~/.bashrc터미널에서 실행 하십시오 ( .와 사이에 공백이 있어야합니다) ~/.bashrc.

이제 별명을 확인할 수 있습니다.

대체 텍스트


5
@ karthick87 당신은 "이제 터미널에서. ~ / .bashrc를 실행하라. (와 ~ / .bashrc 사이에 간격이 있어야한다.)"라고 적었다. 왜이 단계가 필요한가?
Geek

5
첫 번째 '.'는 무엇입니까 에서 할 수 있습니다. ~ / .bashrc?
Zen

22
@Geek @Zen "Execute"가 올바른 용어가 아닙니다. 점은와 같습니다 source. 을 사용하면 . ~/.bashrcbash를 소싱합니다. 파일을 실행하면 자식 프로세스가 시작되고이 프로세스의 명령을 실행 한 다음 반환됩니다. 자식 프로세스에서 수행되는 모든 작업은 부모 프로세스 (실행 한 bash)에 영향을 미치지 않습니다. 대신, 소싱 (점 포함)은 마치 터미널에 파일 내용을 쓴 것처럼 정확하게 작동합니다. 이것이 당신이 원하는 것입니다. .bashrcbash를 시작할 때마다 공급됩니다. 변경하면 새 bash 또는 소스를 수동으로 시작할 때까지 적용되지 않습니다.
Gauthier

@ButtleButkus-전체 시스템이 아닌 한 사용자의 환경 설정 만 변경하려고 할 수 있습니다. 우분투에서 시스템 전체의 .bashrc 파일은 /etc/bash.bashrc입니다.
WillC

1
@ShubhamA. OSX 동작에 대한 이 질문 을 참조하십시오
jandersen

253

별명을 작성하는 방법에는 여러 가지가 있습니다. 가장 많이 사용되는 방법은 다음과 같습니다.

  1. ~/.bashrc파일에 직접 별명 추가

    예를 들면 :이 줄을 ~/.bashrc파일에 추가 하십시오

    alias ll='ls -l'
    alias rm='rm -i'

    다음에 (로그 아웃 / 로그인 또는 완료 후 . ~/.bashrc) 명령 을 입력 rm하면 rm -i명령이 실행됩니다.

  2. 두 번째 방법을 사용하면 별명 파일을 따로 만들 수 있으므로 별명을 파일에 넣을 필요없이 .bashrc선택한 파일에 넣을 수 있습니다. 먼저 ~/.bashrc파일을 편집 하고 다음 줄이 없으면 추가하거나 주석 처리를 제거하십시오.

    if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
    fi

    저장하고 파일을 닫으십시오. 그 후 ~/.bash_aliases, 첫 번째 방법에서 지정한 것과 동일한 형식으로 파일을 작성하고 별명을 추가 하면 됩니다.

    ~/.bash_aliases파일의 내용 :

    alias cs='cd;ls'

71
사용하는 일 ~/.bash_aliases.
ændrük 2016 년

그러나 별칭에 다른 파일을 사용하는 것이 훨씬 더 깨끗하고 배포판 사이에서도 이식 가능합니다. 별칭이 충분하지 않고 함수가 필요하기 때문에 해당 파일을 사용합니다. 따라서 해당 작업에 파일을 대신 사용하면 훨씬 더 깨끗합니다. 다른 별칭이 있습니다-> alias aliases="xdg-open ~/.bash_aliases && source ~/.bash_aliases"이므로 별칭을 저장하면 유용하지 않으며 실수를하면 광고가 나타납니다.
erm3nda

어떻게 든과 같은 별칭을 추가하면 alias ls='ls -althr'주어진 플래그 중 일부가 적용되지 않습니다.이 경우 -t 플래그가 적용되지 않습니다. 왜 그런지 아십니까?
Sajuuk

3
기본적으로 ~/.bashrc에 대한 포함이 포함되어 ~/.bash_aliases있으므로 수정할 필요가 없습니다.
Jaakko

1
우분투 터미널 Windows 10의 경우와 마찬가지로 ~ / .bashrc에 ~ / .bash_aliases가 항상 포함되어있는 것은 아닙니다.이 솔루션은 매우 편리했습니다.
호세

19

유일한 문제는 실행 파일이 아닐 때 .bashrc를 실행하려고하는 것 같습니다. 그러나 이것이 올바른 방법은 아닙니다. 이 파일을 변경할 때마다 다음 명령으로 파일을 "실행"해야합니다.

source ~/.bashrc

그렇지 않으면 단순히 새 셸을 만들고 새 셸 환경에서 파일을 실행 한 다음 종료 될 때 해당 환경을 삭제하여 변경 내용을 잃게됩니다. 스크립트를 소싱하면 현재 셸 내에서 실행되므로 그대로 유지됩니다.

bash_aliases가 존재하지 않기 때문에 두 번째 오류가 발생했다고 가정합니다. 반드시 필요한 것은 아니며 변경 사항을 별도로 정리하여 구성하는 것이 좋습니다. 존재하는 경우에만 사용되며 .bashrc에서 테스트를 볼 수 있습니다.

if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi

~ / .bash_aliases 파일이 있으면 실행합니다.


~/.bash_aliases더 나은. askubuntu.com/questions/194111/…
tomByrer

1
source명령을 사용하면 별칭이 작동했습니다. +1
dspacejs

4
완전성을 위해 : 라인의 초기 점 . ~/.bash_aliases은 쉘 내장 명령과 동일한 의미를 갖습니다 source. 나는 이것이 무슨 일인지 설명하는 정답이라고 생각합니다.
Melebius

17

문제는 실행 파일이 아닌 파일을 실행하려고한다는 것입니다.

ls -la ~/.bashrc
-rw-r--r-- 1 username username 3596 2010-08-05 17:17 /home/pt001424/.bashrc

첫 번째 열에는 "x-executable"문자가 없습니다 (파일 권한).

프로파일 파일은 실행 파일이 아니라 실행 파일이 아니라 다음과 같이로드합니다.

source /home/bakhtiyor/.bashrc

또는

. /home/bakhtiyor/.bashrc

7
echo "alias vps='ssh -X user@example.com'" >> ~/.bashrc

이것은 내가 찾은 예제입니다. 터미널에 몇 글자 ( "vps")를 입력하여 서버에 원격으로 로그인하고 X11 포워딩을 활성화하여 "gedit"와 같은 GUI 앱을 네트워크를 통해 실행할 수있는 방법입니다.

명령 / 별칭 명령이 무엇이든, echo 문, 따옴표 및 명령 출력을 파일에 추가하기위한 기호 (>>)가있는이 방법은 저에게 효과적입니다. 필요한 별칭 명령으로 내 명령을 바꾸고 터미널에 입력하십시오.


여기 인용은 약간 까다 롭습니다. 이 예제에서 큰 따옴표를 사용하는 것은 문제가되지 않지만 따옴표 안에있는 텍스트에 달러 기호, 백 슬래시 등이 포함 된 경우 쉘이 큰 따옴표 안에있는 문자를 처리하는 방법을 이해해야합니다. 외부에서 작은 따옴표로, 내부에서 큰 따옴표로 전환 할 수 있지만 Bash가 별칭 정의에서 큰 따옴표를 처리하는 방법을 이해해야합니다.
tripleee

5

루비를 사용하는 경우 루비 젬을 사용하여 일명 설치할 수 있습니다.

gem install aka2

용법

aka generate hello="echo helloworld" #add an alias
aka g hello="echo helloworld"  #add alias for lazy people

aka destroy hello #remove alias
aka d hello #remove alias for lazy people

루비 젬은 도트 파일을 자동 소싱하므로 필요하지 않습니다. 확인 해봐.


4

이 유용한 함수를 작성하여 새 별칭을 빠르게 만든 다음 별칭 정의 ~/.bash_aliases (있는 경우) 또는에 씁니다 ~/.bashrc.

: ~/.bash_aliases존재 및 실행을 확인하십시오 ~/.bashrc.

# -----------------------------------
#  Create a new permanent bash alias
#
#  @param $1 - name
#  @param $2 - definition
# -----------------------------------
new-alias () { 
  if [ -z "$1" ]; then
    echo "alias name:" && read NAME
  else
    NAME=$1
  fi

  if alias $NAME 2 > /dev/null > /dev/null; then
    echo "alias $NAME already exists - continue [y/n]?" && read YN
    case $YN in
      [Yy]* ) echo "okay, let's proceed.";;
      [Nn]* ) return;;
      * ) echo "invalid response." && return;;
    esac
  fi

  if [ -z "$2" ]; then
    echo "alias definition:" && read DEFINTION
  else
    DEFINTION="$2"
  fi

  if [ -f ~/.bash_aliases ]; then
    echo "alias $NAME=\"$DEFINTION\"" >> ~/.bash_aliases
  else
    echo "alias $NAME=\"$DEFINTION\"" >> ~/.bashrc
  fi

  alias $NAME="$DEFINTION"
}

1
좋은 생각이지만이 기능을 부주의하게 사용하면 .bashrc여러 alias명령 인스턴스 에서 휴지통이 생길 수 있습니다 . 이러한 혼란을 피하기 위해 함수는 확실히 일부 점검을 구현해야합니다.
Troublemaker-DV

이것은 유효한 포인트입니다. @ Troublemaker-DV를 공유 할 의사가있는 해결 방법이 있습니까?
blizzrdof77

그것이 실제로 2 1 / 2yo 나중에인지 확실하지 않지만 ... 1 일에 RC가 별칭 명령을 확인 하여이 별칭이 이미 입력되어 있는지 확인하여 중복을 피합니다. RC가 이미 동일한 이름의 여러 별칭으로 "오염 될"수 있기 때문에 별칭 존재 여부를 확인하는 것만으로는 충분하지 않습니다.
Troublemaker-DV

0

나는 사용하는 것이 좋습니다 /etc/bash.bashrc

해당 파일의 끝에 줄을 추가 할 수 있습니다.

alias ok="ping google.com"

라인 당 별명을 입력 한 후 재부팅하거나 다시 로그인해야합니다.


7
"..을 제안하고 왜 그런 제안을 하시겠습니까?
muru

2
모든 사용자에 대해 시스템 전체 설정을 구체적으로 설치하지 않는 한 시스템 파일을 엉망으로 만들면 안됩니다. 개인 시스템에서는 그 차이가 미미하지만 시스템 파일을 망쳐 놓는 것은 더 복잡합니다. 따라서 개인 취향에 맞는 개인 도트 파일을 선호해야 할 것입니다. 미래도).
tripleee

1
재부팅? 그것은 정말 끔찍한 조언입니다. 특히이 source /etc/bash.bashrc예제에서 원하는 모든 것을 할 때 그렇게하지 마십시오 . 그러나 사용해야 ~/.bashrc또는 ~/.bash_aliases대신
Xen2050

@ Xen2050에서는 재부팅 / 재 로그인 후에 작동 함을 보여주기 위해 재부팅을 제안했습니다. 그건 그렇고, 또 다른 깨끗한 터미널 창도 작동합니다.
Fahad Ahammed

1
재부팅하지 않고 새 커널로 업그레이드 할 수 있습니다. 이것은 오래된 창이 아닙니다. ;-)
Xen2050

0

필자 bashrc가 별칭을 직접 사용하지 말 것을 제안하는 줄을 기억 하거나 가지고 있거나 가지고있었습니다. 솔루션은 외부 파일을 사용하는 것입니다. foobar별칭이 추가되었습니다 만, 추가 (단지 새 터미널을 열거 나) 파일 "공급"해야합니다. 예를 들면 다음과 같습니다.bazbashrc

thufir@dur:~$ 
thufir@dur:~$ alias
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
alias bar='echo foo'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias foo='echo foo'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'
thufir@dur:~$ 
thufir@dur:~$ cat .bash_aliases 
alias foo='echo foo'
alias bar='echo foo'
alias baz='echo baz'

thufir@dur:~$ 
thufir@dur:~$ source .bashrc 
thufir@dur:~$ 
thufir@dur:~$ alias
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
alias bar='echo foo'
alias baz='echo baz'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias foo='echo foo'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'
thufir@dur:~$ 
thufir@dur:~$ baz
baz
thufir@dur:~$ 

이제 baz별칭이 작동합니다. 나는 단지 이전의 대답 이이 기술 을 언급 했다는 것을 깨달았 지만 그들은 lede를 묻었다.

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