.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

これはUbuntu 19.04にあります。誰でもこれを修正する方法を見つけるのを手伝ってくれますか?

回答:


16

警告は2行目にあります。

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.

Enter2番目のエイリアスを入力した後にヒットするのを忘れたように見えます。その結果、同じ行で定義に# ~/.bash...直接従いますalias。先行スペース# ~/.bash...がないと、シェルはコメントとして解釈できませんが、aliasコマンドの引数の一部として解釈できます。

また、実行~/.bash_aliases時にソースとなるファイルにエイリアスを配置することをお勧めします~/.bashrc。そうすれば、編集する必要がなく~/.bashrc、最終的にそれを台無しにすることもありません。

にエイリアスを配置する場合~/.bashrcは、ファイルの最後にエイリアスを追加します。

このトピックの詳細については、質問に対するエリアの優れた回答を参照してください。


6
修正がなぜ機能するのかを説明すれば、この回答の方がはるかに良いでしょう。
アンディ

ありがとう!ところで、対話性チェックの後にエイリアスを配置するという私のアドバイスに従わないことを選択した場合でも# ~/.bashrc: executed by bash(1) for non-login shells.、最初の行として保持することをお勧めします。最初に(またはまったく)表示することを強制する技術的な理由はありません。しかし、それはファイル全体を文書化したコメントです。したがって、他のコードの後に​​表示されることは、人間の読者にとってかなり混乱します。特にOPがこの答えをそのまま受け入れたので、それを変更したくない場合は理解しています。(そのための編集またはそのままにすることは、状況下では合理的だと思います。)
エリアカガン

「preseed」-「precede」という意味ですか?
マイケルハービー

20

mook765は問題の原因について完全に正しいので、その回答で提案されている解決策は構文エラーを修正しますが、別の方法で解決することをお勧めします。

エイリアス定義をに入れる.bashrcことは問題ありませんが、そのファイルの最上部にエイリアス定義(または何か)を置かないことが最善です。

私たちは.bashrc、対話型のシェルによってのみ供給されると考える傾向がありますが、実際にはそうではありません。非対話型のリモートシェル(bashがリモートシェルを識別する場合)もsource .bashrcです。そのため、 Ubuntuのデフォルト.bashrc1には次のコードが含まれています:2

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

基本的に.bashrc、エイリアス定義を含むがそれに限定されない、あなたが入れるすべてのものは、その下のどこかに行くべきです。明確な理由がある場合のみ、そのコードの上に独自のコードを配置する必要がありますが、これはまれです。

エイリアス定義はそのコードの下であればどこにでも配置できますが、ファイルの最後に配置することをお勧めします。または、ファイル内の既存のエイリアス定義の一部の近くに配置することもできます。または、それらを別のファイル~/.bash_aliasesに配置することもできます。ファイルが存在しない場合は作成できます。3これらの選択肢はどれでも結構です。

以下は、対話性チェックの上に自分のコードを置くことができる奇妙で予期しない効果のより一般的な例の1つです。この特定の問題は、コードが出力を生成するときに発生しますが、エイリアス定義からは発生しません。(別名、使用された場合、もちろん出力を生成コマンドに展開することがありますが、しない限り、構文的に正しい別名定義は出力を生成するべきではない-pオプションが渡されているalias。)私は別名定義を期待していない通常さえあれば問題原因非対話型シェルで実行します。いずれにせよ、非対話型シェルはデフォルトではエイリアス展開を実行しません(これは単なるデフォルトです)。ただし、それらが予期しない効果を生むことになった場合、誰もそれを確認しようとは思わないでしょう。

これは確かに、対話性チェックの上にエイリアス定義を置くのを避ける弱い理由だけ.bashrcです。ただし、ファイル内の他の場所に配置することと比較してそうすることの利点はまったくないので、非対話型リモートシェルで意図的に実行することを確認する上記のコードのみを配置するという一般的なアプローチに従うことをお勧めします。


これのもう1つの興味深い側面はこれが構文エラーだった理由です。

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

#コマンドに従うことが許可されているコメントを開始します。ただし、#文字は、その単語の最初の文字を除いて、より大きな単語に現れるときにコメントを開始する効果はありません。(この意味で、「単語」にはpbpaste='xclip -selection clipboard -o'#引用のためなどが含まれます。)コメントとして意図された次のテキストは、alias組み込み関数への追加の引数として使用されます。ただし、の予期しない存在により、構文解析中にエラーが発生(します。これはシェルにとって特別な意味を持ちますが、そのコンテキストでは意味がありません。その結果、aliasビルトインは実際には実行されず、代わりに構文エラーが発生します。

したがって、実際には、その行の'との間にスペースを入れることにより、1文字の編集構文エラーを修正できます#。ただし、上記で詳しく説明したように、さらに先に進んで、ファイル内のエイリアス定義をはるかに低くすることをお勧めします。


1.bashrc Ubuntuのデフォルトは/etc/skel/.bashrc、そのファイルを変更していない限り、で表示できます。これは、ユーザーの作成時にユーザーのホームディレクトリにコピーされます。Ubuntuの多くのファイルと同様に、このファイルはUbuntuの派生元であるDebianから最小限に変更されています。この投稿のアドバイスはUbuntuだけでなくDebianのBashにも適用されますが、すべてのGNU / LinuxシステムでBashに変更を加えずに適用されるとは限りません。

2まれではありますがbash非対話型ログインシェルとして起動することもできます。対話型ログインシェルと同様に、このようなシェルは~/.profile自動的にソースになり、~./profileUbuntuのデフォルトは明示的にsourceになります~/.bashrc。非対話型リモートシェルでの意図しない実行の防止に加えて~/.bashrc、対話型チェックの下に追加することで、非対話型ログインシェルの奇妙なケースで意図しない実行が防止されます。

3 Ubuntuのデフォルトで.bashrcは、~/.bash_aliases存在するかどうかをチェックし([ -f ~/.bash_aliases ])、存在する場合はソースします(. ~/.bash_aliases)。投稿したコードは、変更された.bashrcファイルがこれらのアクションを実行することを確認します。変更されたファイルは、一番上に追加したコードだけであるように見えます。


その答えは、私が持っていたすべての質問をカバーしました(おそらく.bash_aliasesは.bashrcからソースされると予想されることに言及する必要があります
eckes

@EliahKagan、実際、私は真ん中にその文に気づかなかった、おっと。この回答はエイリアスの場所に重点を置いており、実際よりも大きな問題になるように読みました。それがされるようならば例えばエイリアスがあまりにも非対話型シェルに適用された、...私は最初のガード条件を維持に関するあなたのポイントを参照してください、私たちは、これらのさまざまな問題を優先しなければならないために反対しているようです。;)
イルッカチュ

@ilkkachuはい、それについて意見が分かれる可能性があります。一方、mook765がすでに投稿されており、OPが既に承認済みとしてマークした後で、この回答を書き始めました。そこで、その答えを参照してこの答えを始めることにしました(「mook765は問題の原因について完全に正しいです。その答えで提案された解決策は構文エラーを修正します」)。ファイルの最上部以外の場所に配置する代替ソリューション。
エリアケイガン

2
@eckesアドバイスをありがとう-興味がある読者のために、それといくつかの関連する問題をカバーするために、いくつかの巻末注を追加しました。(この文脈で~/.bashrcソーシング~/.bash_aliases特に重要なポイントとは思わない理由は、OPの~/.bashrcファイルを調べると、そうするコードがそのまま残っていることを明らかにするからです。言及することを提案する権利。)
エリアカガン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.