2017-08-22 5 views
0

J'ai un répertoire dit "/ dir". Dans ce répertoire j'ai des fichiers avec le nom arg1_config.tcl, arg2_config.tcl, arg3_config.tcl. Il peut y avoir plus de fichiers avec la même extension. J'essaie de générer dynamiquement des alias pour arg1, arg2 et arg3 dans ce cas et ci-dessous est mon code pour le même.Créer un alias dans un script shell en utilisant une variable

foreach i (`ls <path>/dir/*.tcl`) 
set app = `echo $i | sed -e 's/.*\///g' | sed 's/_config.tcl//g'` 
echo "app is $app" 
alias $app 'run -app $app' # run is an internal script that takes arg1/2/3 as a switch 
echo "alias $app 'run -app $app'" 
end 

Quand je Source ce fichier il imprime

app is arg1 
alias arg1 'run -app arg1' 
app is arg2 
alias arg2 'run -app arg2' 
app is arg3 
alias arg3 'run -app arg3' 

Cependant quand je lance which arg3 il dit aliasé pour exécuter -app application $ et la valeur de l'application est toujours la dernière valeur en quelque sorte après avoir quitté la-à-dire la boucle foreach arg3 dans ce cas. Je ne suis pas en mesure de créer des alias tels que les messages d'impression ci-dessus, i.e.:

alias arg1 'run -app arg1' 
alias arg2 'run -app arg2' 
alias arg3 'run -app arg3' 
+1

L'utilisation de guillemets simples empêche l'extension de la variable. Passer aux guillemets doubles –

+0

Merci Glenn! C'était le problème. Passer à des guillemets a aidé – Rancho

Répondre

2

Je sais que c'est une foire aux questions bash, mais les directives ParsingLs appliquer ici aussi. Ne pas analyser la sortie de ls. Ne fais pas ça. Vous avez aussi des globs dans csh.

foreach i (`ls <path>/dir/*.tcl`) 

doit simplement être

foreach i (<path>/dir/*.tcl) 

Cela dit, le problème que vous vous posez au sujet est comme Glenn a suggéré dans les commentaires. Les guillemets simples et doubles se comportent dans csh de la même manière que dans sh/bash: les guillemets simples bloquent l'expansion des variables. Votre alias ne définit pas réellement un alias, il définit quelque chose qui, lorsqu'il est exécuté, va essayer d'étendre la variable au moment où vous l'exécutez. Essayez d'utiliser des guillemets doubles et voyez si cela vous donne le comportement que vous attendez.

À titre de stratégie alternative pour alias les alias, pensez à lier ou symlinker le script à plusieurs noms sur votre chemin, puis à activer $0 à la place. Il faudra moins de piratage sur les shells, ce qui sera particulièrement visible lorsque quelqu'un décide d'essayer un shell différent et oublie que ces "commandes" ne sont en réalité que des alias de shell. :)

+1

Cela dit, [this] (https://www-uxsup.csx.cam.ac.uk/misc/csh.html) mérite une lecture. – ghoti

+0

Merci pour la description détaillée. Le problème était infact avec les guillemets simples. Passer à des guillemets doubles l'a résolu – Rancho

+0

@glennjackman, oui, c'est pourquoi j'ai ajouté la balise 'csh' à la question. La liste de mots utilisée par l'instruction 'foreach' fait l'extension de chemin (que csh appelle" substitution de nom de fichier "). Et comme je l'ai dit dans la réponse, les guillemets simples et doubles se comportent de la même manière dans csh que dans bash, et les dangers de l'analyse de ls ne sont exclusifs à aucun shell, ils concernent la sortie de 'ls '. – ghoti