Non è un identificatore valido all'avvio del terminale

2

Sto ricevendo questa riga ogni volta che apro il mio terminale. Tutto il resto sembra funzionare bene, ma mi piacerebbe ottenere questo problema poiché non penso sia un buon segno.

Last login: Mon Feb 19 09:21:05 on ttys000
-bash: export: 'Workbooks.app/Contents/SharedSupport/path-bin': not a 
valid identifier
Rachels-MacBook-Pro:~ rachelromine$

Ho controllato il mio bash_profile e questo è come appare

eval export PATH="/Users/rachelromine/.rbenv/shims:${PATH}"
export RBENV_SHELL=bash
source 
'/usr/local/Cellar/rbenv/1.0.0/libexec/../completions/rbenv.bash'
command rbenv rehash 2>/dev/null
rbenv() {
  local command
  command="$1"
  if [ "$#" -gt 0 ]; then
    shift
  fi

  case "$command" in
  rehash|shell)
    eval "$(rbenv "sh-$command" "$@")";;
  *)
    command rbenv "$command" "$@";;
  esac
}

# Setting PATH for Python 3.6
# The original version is saved in .bash_profile.pysave
PATH="/Library/Frameworks/Python.framework/Versions/3.6/bin:${PATH}"
export PATH

test -e "${HOME}/.iterm2_shell_integration.bash" && source 
"${HOME}/.iterm2_shell_integration.bash"

Penso di aver installato qualcosa che non funziona. Se hai idea di cosa ho installato che potrebbe averlo causato sarebbe estremamente utile, ma soprattutto voglio correggere il problema di identificatore valido che appare ogni volta che apro il mio terminale.

    
posta Rachel Riley 19.02.2018 - 19:54
fonte

1 risposta

1

Soluzione (originale nei commenti): rimuovi eval dalla prima riga. Il problema potrebbe essere presente anche in uno degli script che sono source d (nella terza e nell'ultima riga), ma non si è verificato il caso.

Spiegazione: eval fa sì che la shell analizzi il comando due volte. Tecnicamente, passa attraverso tutti i soliti passaggi quando la shell analizza una riga di comando - interpretando e rimuovendo virgolette e caratteri di escape, espandendo variabili, ecc. - quindi passa il risultato al comando eval come argomenti. Il comando eval (che è incorporato in bash, non un eseguibile separato) rimette insieme questi argomenti come se fosse un comando, esegue tutto ciò che analizza roba di nuovo ed esegue il risultato.

Questa è quasi sempre una cattiva idea. L'analisi delle shell è complicata e disordinata, e fare di più rende solo più complicazioni e confusione. Sfortunatamente, a volte le persone lo usano come una sorta di soluzione "colpisci con un martello più grande", e funziona così bene come ci si aspetterebbe di battere le cose con un martello più grande per funzionare.

In questo caso particolare, penso che quello che sta succedendo è che prima che questo script venga eseguito, PATH è impostato su qualcosa come "/ usr / local / bin: / usr / bin: / bin: / usr / sbin: / Applications / Something Workbooks.app/Contents/SharedSupport/path-bin "(dove" Qualcosa "è una parola diversa, ma non conosco il nome specifico dell'app). La shell prende questo:

eval export PATH="/Users/rachelromine/.rbenv/shims:${PATH}"

Rimuove le virgolette e espande ${PATH} , passa il risultato a eval , che viene eseguito:

export PATH=/Users/rachelromine/.rbenv/shims:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/Applications/Something Workbooks.app/Contents/SharedSupport/path-bin

Poiché le virgolette sono state rimosse nel primo passaggio di analisi, quello spazio nel mezzo del nome dell'app viene trattato come un separatore tra gli argomenti (anziché come parte di un nome file), quindi il comando export imposta PATH a "/Users/rachelromine/.rbenv/shims:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/Applications/Something", quindi in un'operazione totalmente non correlata tenta di esportare una variabile denominata "Workbooks.app/Contents/SharedSupport/path-bin" ... che non è un nome di variabile valido ("identificatore").

Ora, per quanto riguarda ciò che eval sta facendo lì, in primo luogo: non lo so. Non riesco a vedere come potrebbe fare qualcosa di buono qui (anche se se non fosse per lo spazio, non avrebbe fatto alcun danno). Presumo che fosse in alcune istruzioni che hai seguito (o un prototipo .bash_profile) per l'installazione di rbenv. Cosa stava facendo , non ne ho idea.

    
risposta data 21.02.2018 - 00:19
fonte

Leggi altre domande sui tag