/ / Zmień powłokę w skrypcie między powłoką a tcsh - linux, bash, shell, tcsh

Zmień powłokę w skrypcie między powłoką a tcsh - linux, bash, shell, tcsh

Mam sytuację, w której ustawiono domyślną powłokęsh lub bash w skrypcie. Muszę zmienić powłokę, aby wykonać określone polecenia w tcsh. Kiedy to robię, nie jestem w stanie ustawić zmiennych.

#!/bin/sh
Variables=/path/set

tcsh
vendor_command.sh

ret=$?

if (ret!= 0)
exit "$ret"
else
echo "success"
fi

Czy jest jakiś sposób na zrobienie tego?

Odpowiedzi:

3 dla odpowiedzi № 1

Odpowiadając na dosłowne pytanie: Nie, nie można płynnie przełączać się między językami skryptowymi, przekazując między nimi zmienne lokalne powłoki, bez samodzielnego implementowania protokołu przesyłania danych.

ty mogą osadzić skrypt tcsh w twoim skrypcie POSIX sh, tak:

#!/bin/sh
# this is run with POSIX sh
export var1="tcsh can see this"
var2="tcsh cannot see this"

tcsh <<"EOF"
# this is run with tcsh
# exported variables (not shell-local variables!) from above are present
var3="calling shell cannot see this, even if exported"
EOF

# this is run in the original POSIX sh shell after tcsh has exited
# only variables set in the POSIX shell, not variables set by tcsh, are available

...jednakże po wyjściu interpretera tcsh wszystkie jego zmienne znikają wraz z nim. Aby przekazać stan w przeciwnym razie, musisz albo wysyłać zawartość na standardowe wyjście i czytać ją lub oceniać, zapisywać zawartość do pliku lub inaczej jawnie implementować pewien interfejs do przekazywania danych między dwoma skryptami.


Wszystko to powiedziawszy, twój przykład jest odręcznie przepisany bez potrzeby używania tcsh:

#!/bin/sh -a
# the -a above makes your variables automatically exported
# ...so that they can be seen by the vendor"s script.

Variables=/path/set

# If vendor_command exits with a nonzero exit status, this
# ...makes the script exit with that same status.
vendor_command.sh || exit

echo "success"