2012-11-12 2 views
4

J'essaie d'exécuter un script csh à partir d'un script tcl.Comment puis-je exécuter un script csh à partir d'un script tcl?

Le script tcl ci-dessous appelle un script csh

#!/usr/bin/tclsh 


set scripts_path /scratch/TCL_scripts/scripts_adders 

set synthesis /scratch/TCL_scripts/synthesis.csh 


set files [glob -directory $scripts_path *] 
split $files 
set files [lsort $files] 
set i 1 

foreach script $files { 

    puts "hello" 
    # puts [pwd] 
    exec /bin/csh -c $synthesis 
    puts $i 

} 

Et le (début du) fichier HCS est ci-dessous:

#!/bin/csh -f 


echo abcdefgh 

Lorsque j'exécute seul le fichier csh de mon terminal unix, ça fonctionne bien. Quand j'appelle mon script Tcl, il s'exécute et écrit "bonjour" et imprime i, mais le fichier csh n'est pas exécuté car "abcdefgh" n'apparaît jamais dans le terminal. J'ai aussi essayé d'autres commandes, et j'ai toujours le même problème: le script csh n'est jamais exécuté quand je l'exécute à partir d'un script Tcl, même s'il fonctionne correctement quand je l'exécute directement depuis le terminal.

(deux mon script Tcl ans de script csh sont exécutables)

Que dois-je faire pour exécuter mon script csh de mon script Tcl?

Merci beaucoup

+0

En note, l'appel à [split $ files] est étranger. Tout d'abord, split renvoie la liste séparée et vous n'économisez pas le résultat. Deuxièmement, parce que glob renvoie déjà les noms de fichiers sous forme de liste et, si vous le traitez comme une chaîne et scindez dessus, il va juste finir de se casser sur les noms de fichiers avec des espaces dedans. – RHSeeger

Répondre

5

Le script csh est exécuté en effet pour vous, mais par défaut la sortie standard devient le résultat de la commande Tcl exec (et si elle produit quoi que ce soit sur l'erreur standard, qui deviendrait une erreur résultat du exec). Pour la sortie et l'erreur apparaissent sur le terminal, vous devez modifier le exec comme ceci:

exec /bin/csh -c $synthesis >@stdout 2>@stderr 

Le >@ dit « redirect la sortie standard au canal suivant » (stdout dans ce cas), et le 2>@-t la même chose pour l'erreur standard.

+0

Merci beaucoup. Cela a bien fonctionné! – Percy

+1

Vous auriez pu aussi faire 'puts [exec ...]' mais je pense que ce que j'ai proposé ressemble plus à ce que vous vouliez. –

+0

D'où vient le "résultat d'erreur" de l'exec? – Scooter

Questions connexes