.Bashrc düzenlendikten sonra “beklenmeyen belirtecin yanında sözdizimi hatası”


11

Panoya erişmeye çalışıyorum ama source ~/.bashrc terminalde girdiğimde bu hatayı alıyorum:

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

Ben de öğretici yapmaya çalıştım Gary Woodfine cevabı için Komut Satırı Pano Erişim .

Çıktı 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

Bu Ubuntu 19.04'te. Birisi bu sorunu nasıl çözeceğimi anlamama yardımcı olabilir mi?

Yanıtlar:


16

Uyarı ikinci satırda:

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

O olmalı:

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

Görünüşe göre aynı satıra doğrudan tanımınızı takiben Enterikinci takma adı girdikten sonra vurmayı unuttunuz . Önceki boşluk olmadan , kabuk tarafından bir yorum olarak yorumlanamaz, ama komutun argümanının bir parçası olarak yorumlanamazdı .# ~/.bash...alias# ~/.bash...alias

Ayrıca yürütüldüğünde ~/.bash_aliaseskaynaklanacak dosyaya takma adlar yerleştirmenizi tavsiye ederim ~/.bashrc, bu yüzden düzenlemenize ~/.bashrcve sonunda karıştırmanıza gerek yoktur .

Takma ad yerleştirme konusunda ısrar ediyorsanız ~/.bashrc, bunları dosyanın sonuna ekleyin.

Bu konuyla ilgili daha ayrıntılı bilgi için lütfen Eliah'ın sorunuza mükemmel cevabına bakın .


6
Düzeltmenin neden işe yaradığını açıkladıysanız bu cevap çok daha iyi olurdu
Andy

Teşekkürler! Btw, etkileşim testinden sonra takma adları bir yere koyma tavsiyemi takip etmemeyi seçse bile # ~/.bashrc: executed by bash(1) for non-login shells., ilk satır olarak kalmanızı tavsiye ederim . İlk önce (veya hiç) görünmeye zorlamak için teknik bir neden yoktur. Ancak tüm dosyayı belgeleyen bir yorumdur. Bu yüzden, diğer kodlardan sonra ortaya çıkması insan okuyucuları için oldukça kafa karıştırıcı. Bunu değiştirmek istemiyorsanız anlıyorum, özellikle de OP bu cevabı olduğu gibi kabul ettiğinden. (Bence bunun için düzenleme yapmak ya da sadece bırakmak, koşullar altında makul.)
Eliah Kagan

'preseed' - 'öncesinde' mi demek istediniz?
Michael Harvey

20

mook765, sorunun nedeni hakkında tamamen doğrudur ve bu yanıtta önerilen çözüm, sözdizimi hatasını düzeltir, ancak farklı bir şekilde çözmenizi öneririz.

Takma ad tanımlarını koymak iyidir .bashrc, ancak bunları ya da herhangi bir şeyi o dosyanın en üstüne koymamak en iyisidir.

Biz .bashrcsadece interaktif mermilerden kaynaklanıyor gibi düşünüyoruz , ama aslında durum böyle değil. Etkileşimli olmayan uzak kabuklar ( bash bunları böyle tanımlıyorsa ) da kaynaktır .bashrc. Bu nedenle Ubuntu'nun varsayılan .bashrc1'i şu kodu içerir: 2

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

Temel olarak .bashrc, takma ad tanımları dahil, ancak bunlarla sınırlı olmamak üzere, koyduğunuz her şey , bunun altında bir yere gitmelidir. Kendi kodunuzu sadece bu kodun üzerine koymanız gerekir, bunun için açık bir nedeniniz varsa, bu nadirdir.

Takma ad tanımlarınızı bu kodun altında herhangi bir yere koyabilirsiniz , ancak bunları dosyanın sonuna koymanızı öneririm. Veya bunları dosyadaki mevcut takma ad tanımlarının bazılarının yanına koymayı tercih edebilirsiniz. Veya bunları ~/.bash_aliasesyoksa, oluşturabileceğiniz ayrı bir dosyaya koymayı tercih edebilirsiniz. 3 Bu seçeneklerden herhangi biri iyidir.

İşte kişinin kendi kodunu koyarak tuhaf ve beklenmedik etkilerin daha yaygın örneklerinden biri yukarıda olabilir etkileşim çek. Bu sorun, kod bir diğer ad tanımlamasından oluşmaması gereken çıktı ürettiğinde ortaya çıkar. (Takma ad, kullanıldıklarında, elbette çıktı üretir bir komuta genişletmek olabilir, ama sürece bir sözdizimsel doğru takma tanım çıktı üretmek olmamalıdır -pseçenek geçirilir alias.) Ben ad tanımları beklemeyin genellikle sorunlara neden da olsalar etkileşimli olmayan kabuklarda koşmak. Etkileşimli olmayan mermiler zaten varsayılan olarak takma ad genişletme yapmaz (bu yalnızca bir varsayılan olsa da). Ancak, sonuçta beklenmedik etkiler üretiyorlarsa, muhtemelen kimse bunu kontrol etmeyi düşünmeyecektir.

Kuşkusuz bu, etkileşim tanımının üzerine takma ad tanımları koymaktan kaçınmak için sadece zayıf bir nedendir .bashrc. Ancak, bunları dosyada başka bir yere koymaya kıyasla kesinlikle yapmanın hiçbir yararı olmadığından, kasıtlı olarak etkileşimli olmayan uzak kabuklarda çalışmayı planladığınızı kontrol eden kodun üzerine koyma genel yaklaşımını izlemenizi öneririm .


Bu diğer ilginç yönü neden bu sözdizimi hatası oldu:

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

#komutları izlemesine izin verilen yorumları başlatır. Ancak, #karakterin, daha büyük bir kelimede göründüğünde bir yorumun başlatılması gibi bir etkisi yoktur, o kelimenin ilk karakteri hariç. (Bu anlamda, "kelime" gibi şeyler içerir pbpaste='xclip -selection clipboard -o'#, bağlı alıntı için .) Bir yorum olarak düşünülmüştü aşağıdaki metni, ek argümanlar olarak alınmıştır aliasyerleşiğini. Ancak (, kabuk için özel bir anlamı olan, ancak bu bağlamda mantıklı olmayan beklenmedik varlığı nedeniyle, onları ayrıştırırken bir hata oluşur . Etkisi aliasyerleşik aslında asla çalışır ve bunun yerine bir sözdizimi hatası alırsınız.

Bu nedenle, söz konusu satırdaki 've #karakterleri arasına boşluk koyarak sözdizimi hatasını tek karakterlik bir düzenlemeyle düzeltmek mümkün olurdu . Ancak yukarıda ayrıntılı olarak açıklandığı gibi, daha ileri gitmenizi ve takma ad tanımlarını dosyada daha düşük taşımayı öneririm.


1.bashrc Ubuntu'dakivarsayılan,/etc/skel/.bashrcbu dosyayı değiştirmediğiniz sürecegörülebilir. Bu, kullanıcı oluşturulduğunda kullanıcının ana dizinine kopyalanır. Ubuntu'daki birçok dosya gibi, bu dosya da Ubuntu'nun türetildiği dağıtım olan Debian'dan minimal olarak değiştirilmiştir. Bu yazıdaki tavsiye, Ubuntu'nun yanı sıra Debian'daki Bash için de geçerlidir, ancak tüm GNU / Linux sistemlerinde Bash üzerinde değişiklik yapılmadan mutlaka geçerli değildir.

2 Nadir de olsa,bashetkileşimli olmayan bir giriş kabuğu olarakbaşlamak da mümkündür . Etkileşimli giriş kabukları gibi, böyle bir kabuk kaynakları~/.profileotomatik olarak ve~./profileUbuntu'dakivarsayılankaynak açıkça~/.bashrc. Etkileşimli olmayan uzak kabuklarda istemeden yürütülmesini önlemenin yanı sıra, eklemelerinizi~/.bashrcetkileşim denetiminin altınakoymak, etkileşimli olmayan bir giriş kabuğunun garip durumunda istemeden yürütülmesini de engeller.

3 Ubuntu'nun varsayılanı.bashrc,~/.bash_aliasesvarsa ([ -f ~/.bash_aliases ])olupolmadığınıdenetlervevarsa () kaynak. ~/.bash_aliasesyapar. Gönderdiğiniz kod, değiştirilen.bashrcdosyanızın bu eylemleri gerçekleştirdiğinidoğrular; budosyada yapılan tek değişiklik, en üste eklediğiniz koddu.


Bu cevap, sahip olduğum tüm soruları kapsıyordu, harika (belki .bash_aliases'in .bashrc
eckes'ten 5:19

@EliahKagan, aslında, o cümle ortasında fark etmedim, hata! Bu cevabın vurgulanması, takma adların yerini, sanki gerçekte olduğundan daha büyük bir sorunmuş gibi okumasını sağlamıştır. Olurdu gibi eğer diğer adlar çok etkileşimli olmayan kabukları uygulanmıştır örneğin, ... Ben ilk muhafız koşulunu tutmak hakkında istediğini anladım, ama biz bu farklı konular öncelik verilmelidir sipariş üzerine katılmıyorum görünüyor. ;)
ilkkachu

@ilkkachu Evet, bu konuda aynı fikirde değiliz. Öte yandan, bu cevabı mook765'ler zaten gönderildikten ve OP zaten kabul edilmiş olarak işaretledikten sonra yazmaya başladım . Bu yüzden bu cevaba (" mook765 sorunun nedeni hakkında tamamen doğru ve bu cevapta önerilen çözüm sözdizimi hatasını düzeltir") başvurarak başlamaya karar verdim . onları dosyanın en üst kısmından başka bir yere koymanın alternatif çözümü.
Eliah Kagan

2
@eckes Tavsiye için teşekkürler - İlgilenen okuyucular için bunu ve bununla ilgili bazı konuları ele almak için birkaç son not ekledim. (Ben düşünmüyoruz nedeni ~/.bashrckaynak ~/.bash_aliasesbir olmak özellikle bu bağlamda önemli bir nokta OP'ın bu muayene olan ~/.bashrcBununla birlikte, ilgili ve ilginç hem de. Dosyasından yapar kod bozulmadığını ortaya koymaktadır, ve sen söz edilmesini önerme hakkı.)
Eliah Kagan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.