Também colocando o comando echo '...'
inteiro em
cat <<'EOF' >> /home/USER/.bashrc
...
EOF
ajudaria você a livrar-se das muitas citações internas.
$ sh bashtrrrrrr
# whats my pub. ip?
bashtrrrrrr: line 19: unexpected EOF while looking for matching '''
bashtrrrrrr: line 20: szintaktikai hiba: váratlan fájl vég
$ cat bashtrrrrrr
#!/bin/bash
echo '
# what's my pub. ip?
alias myip="curl -s "http://checkip.dyndns.org/" | grep -o "[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*" | head -1"
# shorten ssh connection with tsocks
function t() { read THEIP; tsocks ssh root@$THEIP; }
# red/green terminals regarding exit code
export PROMPT_COMMAND='PS1="'
if [[ \$? = "0" ]];
then echo "\[\033[0;32m\]";
else echo "\[\033[0;31m\]";
fi'[\u@\h \w]\[\e[m\] "'
export PS1
' >> /home/USER/.bashrc
o que estou perdendo?
Como as outras respostas mencionam, o problema são citações aninhadas.
Eu sugiro que você revise como as citações funcionam no bash . Em suma, citações
(de qualquer tipo, aspas simples '
, aspas duplas "
ou backticks ')
são quase sempre combinados com a primeira ocorrência de uma citação do
mesmo tipo; você tem que escapar uma cotação para não corresponder
(mas você não pode escapar de aspas simples '
).
Então, (1) o apóstrofo em what's
fecha a aspa simples em echo '
:
echo '
# what's my pub. ip?
Em outras palavras, seu comando echo
termina depois de ... ip?
e o restante
é imediatamente executado por bash como um comando, que aparentemente não é
o que você quis dizer.
Como a resposta de Rajish ' sugere, usando aqui-documentos resolve muitas das citações questões:
echo >> /home/USER/.bashrc <<'__EOF__'
# what's my pub ip?
echo "we can nest quotes in here"
__EOF__
(2) Depois, como já foi reportado na resposta do ultrasawblade , as citações nesta linha fazem não corresponde corretamente:
alias myip="curl -s "http://checkip.dyndns.org/" | grep -o "[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*" | head -1"
Você provavelmente quer o primeiro e o último "
(aspas duplas)
caracteres na linha para combinar, mas bash combina com eles na ordem
eles são encontrados na linha (da esquerda para a direita), então as aspas duplas
left de "http://...
fecha as aspas depois de alias myip="
.
Da mesma forma, | grep -o
e | head -1
são considerados dentro
aspas e http://...
e [0-9]*\....
não são . (Isso não
tem sérias conseqüências sintáticas neste caso, além de
grep
não vê as barras invertidas, mas lembre-se de que
futuro.)
Uma solução é escapar das aspas duplas (e também das barras invertidas, como barras invertidas não perdem seu significado especial entre aspas duplas):
alias myip="curl -s \"http://checkip.dyndns.org/\" | grep -o \"[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\" | head -1"
Outra solução alternativa, que funciona nesse caso, é usar aspas simples
'
em vez disso; para definir o alias:
alias myip='curl -s "http://checkip.dyndns.org/" | grep -o "[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*" | head -1'
ou para os comandos na definição de alias:
alias myip="curl -s 'http://checkip.dyndns.org/' | grep -o '[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*' | head -1"
(3) Finalmente, nas linhas:
export PROMPT_COMMAND='PS1="'
if [[ \$? = "0" ]];
O caractere '
(aspas simples) após PROMPT_COMMAND=
é
interpretado como o início de uma nova string de várias linhas com aspas simples,
que termina na linha:
fi'[\u@\h \w]\[\e[m\] "'
Assim, outra string citada individualmente é iniciada pelo caractere '
em
a última linha, mas o bash nunca vê uma cota única correspondente. Assim você
obter o erro:
unexpected EOF while looking for matching '''
Bem, um problema é esta linha:
myip="curl -s "http://checkip.dyndns.org/" | grep -o "[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*" | head -1"
bash
é confundido pelas aspas no meio da string. Quando você coloca "aspas entre aspas", você geralmente quer escapar delas, assim:
myip="curl -s \"http://checkip.dyndns.org/\" | grep -o \"[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\" | head -1"