Для переменных можно использовать анонимную функцию (как указано в комментарии выше). Это означает, что вы можете определить столько переменных, сколько захотите. Те, которые вы хотите скрыть от вызывающего абонента, вы ставите префиксом local
, те, которые вы хотите передать вызывающему абоненту, вы просто определяете как обычно:
function {
local my_var=foo
your_var=bar
: ...
}
Но для функций, которые не будут работать, поскольку они не могут быть объявлены местный
. У меня была эта проблема в моем zshrc , и я решил добавить ко всем именам моих «локальных» функций короткую строку (как вы делаете пространства имен в C) и выполнить функцию подстановочного знака
в конец:
function foo-do-something () {
: ...
}
function foo-do-some-more-stuff () {
: ...
}
function foo-main () {
local my_var=oof
you_var=rab
foo-do-something for bar
foo-do-some-more-stuff with baz
}
foo-main
unfunction -m 'foo-*'
На мой взгляд, это не оптимальное решение (я бы предпочел локальные функции), но у меня оно работает.
Мой первый совет - смените оболочку на что-нибудь другое. Тем не менее, это должно делать то, что вы хотите:
set file = "V_181_V_d_2_um_phi_4.50_eV_tOn_0.5_ns/SteadyState_out.e"
set newname = "`echo $file | cut -d "/" -f1`.e"
mv "$file" "$newname"
Это не сохранит файл в его исходном каталоге. Я не знаю, хотите ли вы этого, поскольку вы фактически не объяснили, чего вы пытаетесь достичь, но если вы хотите, чтобы файл оставался в исходном каталоге, вы можете сделать:
set dirname = "V_181_V_d_2_um_phi_4.50_eV_tOn_0.5_ns"
set file = "SteadyState_out.e"
set newname = "`echo $dirname | cut -d "/" -f1`.e"
mv "$dirname"/"$file" "$dirname"/"$newname"
csh
(и tcsh
и zsh
) имеют : h
, : t
модификаторы для извлечения заголовка (имя каталога) или хвоста (базовое имя) файла.
Итак, вы можете сделать:
set x = V_181_V_d_2_um_phi_4.50_eV_tOn_0.5_ns/SteadyState_out.e
mv -- $x:q $x:h/$x:h:t:q