.bashrc를 편집 한 후“예기치 않은 토큰 근처의 구문 오류”


11

클립 보드에 액세스하려고하는데 source ~/.bashrc 터미널에 입력 하면이 오류가 발생합니다.

bash: /home/taran/.bashrc: line 2: syntax error near unexpected token ('
bash: /home/taran/.bashrc: line 2:alias pbpaste='xclip -selection 
clipboard -o'# ~/.bashrc: executed by bash(1) for non-login shells

나는의 튜토리얼하려고 노력 게리 Woodfine의 대답명령 줄 클립 보드 액세스 .

출력 cat ~/.bashrc은 다음과 같습니다.

alias pbcopy='xclip -selection clipboard'
alias pbpaste='xclip -selection clipboard -o'# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

# don't put duplicate lines or lines starting with space in the history.
# See bash(1) for more options
HISTCONTROL=ignoreboth

# append to the history file, don't overwrite it
shopt -s histappend

# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=1000
HISTFILESIZE=2000

# check the window size after each command and, if necessary,
# update the values of LINES and COLUMNS.
shopt -s checkwinsize

# If set, the pattern "**" used in a pathname expansion context will
# match all files and zero or more directories and subdirectories.
#shopt -s globstar

# make less more friendly for non-text input files, see lesspipe(1)
[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"

# set variable identifying the chroot you work in (used in the prompt below)
if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
    debian_chroot=$(cat /etc/debian_chroot)
fi

# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
    xterm-color|*-256color) color_prompt=yes;;
esac

# uncomment for a colored prompt, if the terminal has the capability; turned
# off by default to not distract the user: the focus in a terminal window
# should be on the output of commands, not on the prompt
#force_color_prompt=yes

if [ -n "$force_color_prompt" ]; then
    if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
    # We have color support; assume it's compliant with Ecma-48
    # (ISO/IEC-6429). (Lack of such support is extremely rare, and such
    # a case would tend to support setf rather than setaf.)
    color_prompt=yes
    else
    color_prompt=
    fi
fi

if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt

# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
    PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
    ;;
*)
    ;;
esac

# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
    test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
    alias ls='ls --color=auto'
    #alias dir='dir --color=auto'
    #alias vdir='vdir --color=auto'

    alias grep='grep --color=auto'
    alias fgrep='fgrep --color=auto'
    alias egrep='egrep --color=auto'
fi

# colored GCC warnings and errors
#export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'

# some more ls aliases
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'

# Add an "alert" alias for long running commands.  Use like so:
#   sleep 10; alert
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 definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.

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

# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if ! shopt -oq posix; then
  if [ -f /usr/share/bash-completion/bash_completion ]; then
    . /usr/share/bash-completion/bash_completion
  elif [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
  fi
fi

우분투 19.04에 있습니다. 누구 든지이 문제를 해결하는 방법을 알아낼 수 있습니까?

답변:


16

경고는 두 번째 줄에 있습니다.

alias pbcopy='xclip -selection clipboard'
alias pbpaste='xclip -selection clipboard -o'# ~/.bashrc: executed by bash(1) for non-login shells.

다음과 같아야합니다.

alias pbcopy='xclip -selection clipboard'
alias pbpaste='xclip -selection clipboard -o'
# ~/.bashrc: executed by bash(1) for non-login shells.

Enter두 번째 별칭을 입력 한 후 타격을 잊어 버린 것처럼 보입니다 . 이는 동일한 줄에서 정의를 # ~/.bash...직접 따릅니다 alias. 선행 공백 # ~/.bash...이 없으면 쉘에서 주석으로 해석 할 수 없지만 alias명령 인수의 일부로 해석 할 수 없습니다 .

또한 실행될 ~/.bash_aliases때 소스가 될 파일에 별칭을 배치하는 것이 좋습니다 ~/.bashrc. 따라서 편집 할 필요가 없으며 ~/.bashrc결국 엉망으로 만들 필요가 없습니다 .

에 별칭을 배치해야하는 ~/.bashrc경우 파일 끝에 별칭을 추가하십시오.

이 주제에 대한 더 깊은 통찰력을 얻으 려면 질문에 대한 엘리아의 탁월한 답변 을 참조하십시오 .


6
수정이 작동하는 이유를 설명하면이 답변이 훨씬 나을 것입니다.
Andy

감사! Btw는 상호 작용 검사 후 어딘가에 별칭을 넣는 것에 대한 조언을 따르지 않더라도 # ~/.bashrc: executed by bash(1) for non-login shells.첫 번째 줄로 유지하는 것이 좋습니다 . 처음 또는 전혀 나타나지 않도록하는 기술적 이유는 없습니다. 그러나 전체 파일을 설명하는 주석입니다. 따라서 다른 코드 뒤에 나타나기 때문에 인간 독자에게는 상당히 혼란 스럽습니다. 특히 OP 가이 답변을 그대로 수락했기 때문에 변경하고 싶지 않다는 것을 알고 있습니다. (나는 그것에 대해 편집을 생각 하거나 그냥 모두 상황에서 합리적인 떠나.)
엘리야 케이건

'preseed'- 'precede'를 의미 했습니까?
Michael Harvey

20

mook765는 문제의 원인에 대해 완전히 정확 하며 해당 답변에서 제안 된 솔루션은 구문 오류를 수정하지만 다른 방법으로 해결하는 것이 좋습니다.

에 별칭 정의를 넣는 .bashrc것이 좋지만 해당 파일의 맨 위에 별칭을 정의 하지 마십시오.

우리는 .bashrc대화식 쉘만 소스 로 생각하는 경향 이 있지만 실제로는 그렇지 않습니다. 비 대화식 원격 쉘 ( bash가 그렇게 식별 한 경우 )도 source .bashrc입니다. 이것이 우분투의 기본 .bashrc1 에 다음 코드가 포함 된 이유입니다 . 2

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

기본적으로 .bashrc별칭 정의를 포함하여 (에 국한되지는 않음) 입력 한 모든 내용 은 그 아래에 있어야합니다. 명확한 이유가있을 경우에만 자신의 코드를 해당 코드 위에 두어야합니다.

별명 정의를 해당 코드 아래에 둘 수 있지만 파일의 맨 끝에 배치하는 것이 좋습니다. 또는 파일의 기존 별명 정의 근처에 배치하는 것이 좋습니다. 또는 별도의 파일 ~/.bash_aliases에 저장하는 것이 좋습니다 (없는 경우 만들 수 있음). 3 이러한 선택 중 어느 것이나 좋습니다.

다음 은 상호 작용 검사 보다 고유 한 코드를 사용하는 기괴하고 예상치 못한 효과의 일반적인 예 중 하나 입니다. 이 특정 문제는 코드가 출력을 생성 할 때 발생하며 이는 별칭 정의에서 발생해서는 안됩니다. (별명을 사용하는 경우 물론 출력을 생성하는 명령으로 확장 될 수 있지만, 구문이 올바른 별명 정의는 -p옵션이 전달 되지 않는 한 출력을 생성하지 않아야합니다 alias.) 별명 정의가 일반적으로 문제가 발생하더라도 예상하지는 않습니다. 비 대화식 쉘에서 실행합니다. 비 대화식 쉘은 기본적으로 별명 확장을 수행하지 않습니다 (단, 이것이 기본값 일 뿐임). 그러나 그들이 예기치 않은 효과를 낳으면 아무도 그것을 확인하려고 생각하지 않을 것입니다.

이것은 상호 작용 체크인에 별명 정의를 두지 않는 약한 이유 일뿐입니다 .bashrc. 그러나 파일의 다른 위치에 배치하는 것과 비교할 때 이점이 전혀 없으므로 대화 형이 아닌 원격 셸에서 의도적 으로 실행 하려는 경우 위의 코드 만 배치하는 일반적인 방법을 따르는 것이 좋습니다 .


이것의 또 다른 흥미로운 측면은 이것이 구문 오류 인 이유입니다 .

alias pbpaste='xclip -selection clipboard -o'# ~/.bashrc: executed by bash(1) for non-login shells.

#명령을 따르도록 허용 된 주석을 시작합니다. 그러나 #문자는 해당 단어의 첫 문자를 제외하고 큰 단어로 표시 될 때 주석을 시작하는 효과가 없습니다. (이런 의미에서 "단어"일이 좋아 포함 pbpaste='xclip -selection clipboard -o'#, 때문에 인용에 .) 주석으로 의도 된 다음 텍스트는,의에 대한 추가 인수로한다 alias내장. 그러나의 예기치 않은 존재로 인해 파싱하는 동안 오류가 발생 (하는데, 이는 쉘에 특별한 의미가 있지만 해당 컨텍스트에서는 의미가 없습니다. 결과적으로 alias내장은 실제로 실행되지 않으며 대신 구문 오류가 발생합니다.

따라서 실제로 해당 줄 의 '#문자 사이에 공백을 두어 한 문자 edit로 구문 오류를 수정할 수 있습니다 . 그러나 위에서 자세히 설명했듯이 파일에서 별칭 정의를 훨씬 더 낮추고 이동하는 것이 좋습니다.


1 파일을 수정하지 않은 한.bashrcUbuntu의 기본값은에서 볼 수 있습니다/etc/skel/.bashrc. 이것은 사용자가 작성 될 때 사용자의 홈 디렉토리로 복사됩니다. 우분투의 많은 파일과 마찬가지로이 파일은 데비안에서 최소한으로 변경되었으며, 우분투가 파생 된 배포판입니다. 이 게시물의 조언은 데비안의 Bash와 우분투에 적용되지만 모든 GNU / Linux 시스템에서 Bash를 수정하지 않고 반드시 적용되는 것은 아닙니다.

2 드물지만비 대화식 로그인 셸로시작할 수도 있습니다bash . 대화식 로그인 쉘과 같이 이러한 쉘은~/.profile자동~./profile으로 소스가되고 Ubuntu의 기본값은 명시 적으로 source~/.bashrc입니다. 비 대화식 원격 셸에서 의도하지 않은 실행을 방지하는 것 외에도~/.bashrc, 상호 작용 검사 아래에추가하면 비 대화식 로그인 셸의 이상한 경우에 의도 치 않게 실행되는 것을 방지 할 수 있습니다.

3 우분투의 기본 설정은존재.bashrc하는지~/.bash_aliases([ -f ~/.bash_aliases ])확인하고존재하면소스 (. ~/.bash_aliases)를 확인합니다. 게시 한 코드는 수정 된.bashrc파일이 해당 작업을 수행하는지 확인합니다. 맨 위에 추가 한 코드 만 변경된 것 같습니다.


그 대답은 내가 가진 모든 질문에, 중대한는 (어쩌면의 .bashrc에서 공급 될 것으로 예상된다 .bash_aliases을 언급해야 덮여
eckes

@EliahKagan, 사실, 나는 중간에 그 문장을 보지 못했습니다. 이 답변은 실제보다 더 큰 문제인 것처럼 읽은 별칭의 위치를 ​​강조합니다. 그것이 될 것으로 하면 별명이 너무 비 대화식 쉘에 적용된 예 ... 내가 먼저 가드 상태를 유지에 대한 귀하의 지점을 참조 할 수 있지만, 우리는 서로 다른 문제가 우선해야 순서에 동의하지 않을 것으로 보인다. ;)
ilkkachu

@ilkkachu 네, 우리가 그것에 동의하지 않을 수도 있습니다. 반면에, mook765 's 가 이미 게시되어 있고 OP가 이미 수락 한 것으로 표시 한 후에이 답변을 작성하기 시작했습니다 . 그래서 나는 그 대답을 참조 하여이 대답을 시작하기로 결정했습니다 ( " mook765는 문제의 원인에 대해 완전히 정확 하고 그 대답에서 제안 된 솔루션은 구문 오류를 수정합니다"). 파일 맨 위 이외의 다른 곳에 배치하는 대안 솔루션.
Eliah Kagan

2
@eckes 조언을 주셔서 감사합니다-관심있는 독자들을 위해 그와 관련된 문제를 다루기 위해 몇 가지 미주를 추가했습니다. ( 이 맥락에서 ~/.bashrc소싱 ~/.bash_aliases특히 중요한 점 이라고 생각하지 않는 이유 는 OP ~/.bashrc파일 을 검사 하면 코드가 손상되지 않았 음을 알 수 있기 때문입니다. 그러나 관련성이 있고 흥미 롭습니다. 언급 할 권리가 있습니다.)
Eliah Kagan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.