J'utilise bash Shell, mais certains des scripts dont j'ai besoin pour obtenir des sources sont au format csh. Quelqu'un peut-il dire comment je peux obtenir des scripts csh à partir du shell bash?
Par sourcing, je veux dire que le script csh issu de sources devrait pouvoir définir les variables d’environnement. Donc, je veux faire quelque chose comme ça dans mon ~/.bashrc
:
source path/to/csh_script/script.cshrc
bash ne lancera pas tous les scripts csh à la perfection. Il peut y avoir un certain chevauchement de base, par exemple des scripts bash très basiques s'exécutant en sh/dash, mais s'il échoue en bash (test avec bash [file]
), il n'y a aucun problème. Soit
exécutez-les avec csh, appelé à partir du script bash, comme si vous les exécutiez dans un terminal, leur demandant de renvoyer une valeur de résultat ou de faire ce qu'ils sont supposés faire. Cela ne laisserait aucune variable ou fonction disponible au script bash principal, comme vous l'avez commenté.
Si vous cherchez uniquement des variables source, il est théoriquement possible de parcourir ligne par ligne le script csh et d'ajouter uniquement les variables dans le shell/script bash actuel. Quelque chose de semblable à ceci:
while read line
do
[stuff with $line]
done < /path/to/[the csh script to add]
Je ne sais pas comment toutes les variables sont présentées dans les scripts que vous recherchez, c'est donc à vous de décider de ce que devrait être le [contenu de $ line].
Si elles ressemblent à bash , alors peut-être ne feriez-vous que griller les lignes commençant par des espaces ou des caractères, avoir un =
avec éventuellement plus de caractères avec pas d'espaces, donc:
echo "$ line" | grep '^\s*\S*=\S*'
ou comme ci-dessus avec n'importe quoi après le =
avec:
echo "$ line" | grep '^\s*\S*=.*'
Mais je pense Les variables csh commencent toutes par set
/setenv
, afin de pouvoir trouver les lignes set/setenv, puis jettent le set/setenv. Essayez en entrée:
echo "$line" | grep '^\s*\S*set.*=.*'
Ce ne sont que des exemples rapides de modèles de grep/regex, voir this & that & autres pour plus d'informations.
Ou bien, s'il ne s'agit que de quelques-uns d'entre eux, parcourez-les manuellement et collez toutes les variables dans des fichiers compatibles bash/sh que vous pourrez ensuite source en bash sans aucun problème.
La ligne Shebang s’occupe déjà de cela pour vous. Lorsque vous exécutez un script dont la première ligne est #! /bin/csh -f
, le système reconnaîtra la partie #!
en tant que script et chargera l'interpréteur spécifié après celui-ci (dans ce cas, /bin/csh
).
Alternativement, vous pouvez appeler l'interprète explicitement, avec csh /path/to/script.csh
.
Voici une petite démo. Mon shell interactif est mksh
et j'appelle un simple script csh
:
xieerqi:
$ cat bin/whiledemo.csh
#! /bin/csh -f
# demoloop.csh - Sample loop script
set j = 1
while ( $j <= 5 )
echo "Welcome $j times"
@ j++
end
xieerqi:
$ echo $Shell
/bin/mksh
xieerqi:
$ bin/whiledemo.csh
Welcome 1 times
Welcome 2 times
Welcome 3 times
Welcome 4 times
Welcome 5 times
xieerqi:
$ csh bin/whiledemo.csh
Welcome 1 times
Welcome 2 times
Welcome 3 times
Welcome 4 times
Welcome 5 times
Notez que si vous avez même un espace devant #!
, le #!
ne sera pas interprété. Par conséquent, le script s'exécutera avec votre shell interactif à partir duquel vous l'appelez. Naturellement, vous pouvez vous attendre à ce que le script échoue en raison d'une syntaxe différente entre le script et des attentes de Shell interactif. En écrivant cette réponse, j'ai rencontré cette erreur exacte.