2013-03-19 10 views
5

trovo espansione della tilde non funziona per la seguente situazione:guscio espansione della tilde non funziona quando viene passato come opzione

$ set -x 

$ ./print_arg.pl destdir=~/test 
+ ./print_arg.pl 'destdir=/root/test' 
destdir=/root/test 

$ ./print_arg.pl dest-dir=~/test 
+ ./print_arg.pl 'dest-dir=~/test' 
dest-dir=~/test 

$ ./print_arg.pl -destdir=~/test 
+ ./print_arg.pl '-destdir=~/test' 
dest-dir=~/test 

Il contenuto di print_arg.pl è

#!/usr/bin/perl 
print $ARGV[0],"\n"; 

Secondo Order of Shell processing Shell si dividerà prima di "espansione tilde". E ho notato che la divisione delle parole in realtà è diversa. Qual è la ragione per i diversi risultati?

risposta

4

L'espansione del tilde si verifica anche nell'assegnazione della variabile shell, che è simile a destdir=~/test. dest-dir=~/test e -destdir=~/test no, poiché - non è un carattere valido in un nome di variabile. Sebbene la shell non stia valutando destdir=~/test come assegnazione variabile (sarebbe, se si utilizza set -k), il parser lo sta ancora trattando come tale e sta eseguendo l'espansione tilde sul RHS.

Da http://www.gnu.org/software/bash/manual/html_node/Tilde-Expansion.html#Tilde-Expansion:

Ogni assegnazione di variabile è controllato per prefissi tilde non quotati immediatamente dopo un ‘:’ o il primo ‘=’. In questi casi viene eseguita anche l'espansione della tilde. Di conseguenza, si possono usare nomi di file con tilde in assegnazioni a PATH, MAILPATH e CDPATH e la shell assegna il valore espanso.

Si noti che con il set -k opzione, le assegnazioni delle variabili appropriate sono trattati come tali e rimossi dalla lista degli argomenti passati al print_arg.pl:

~ $ set -kx 
~ $ ./print_arg.pl destdir=~/bin foo 
+ destdir=/Users/clint/bin 
+ ./print_arg.pl foo 
foo 
~ $ ./print_arg.pl dest-dir=~/bin foo 
+ ./print_arg.pl 'dest-dir=~/bin' foo 
dest-dir=~/bin 
+0

Ho anche notato la frase "Le parole che il parser ha segnato come assegnazioni di variabili (** quelle che precedono il nome del comando **) e i reindirizzamenti vengono salvati per l'elaborazione successiva. " Quindi "destdir = ~/test" dopo che il comando potrebbe non essere contrassegnato come un'assegnazione affidabile. Allora come spiegarlo? – lisper

+0

A causa dell'opzione 'set -k' shell, * potrebbe * essere un'assegnazione variabile. La mia ipotesi è che il parser non controlla se l'opzione è impostata e contrassegna qualsiasi cosa che potrebbe essere un compito valido in quanto tale. Dopo aver completato l'analisi (inclusa l'espansione della tilde), il codice responsabile della valutazione del comando analizzato può verificare se i compiti che seguono un comando devono essere valutati, in base a 'set -k'. Si potrebbe obiettare che è un errore in 'bash' ignorare' set -k' quando si identificano per prime le assegnazioni delle variabili. – chepner

+1

Ho capito. Grazie per l'eccezionale spiegazione – lisper

Problemi correlati