micha@linux-micha: /tmp
$ echo 'alpha bravo charlie' > blah.txt
micha@linux-micha: /tmp
$ cat blah.txt
alpha bravo charlie
micha@linux-micha: /tmp
$ sed -i 's/bravo/delta/' blah.txt
micha@linux-micha: /tmp
$ cat blah.txt
alpha delta charlie
$ bash -c 'false; echo "[$status]" "[`echo \$?h`]"'
[] [1h]
$ csh -c 'false; echo "[$status]" "[`echo \$?h`]"'
[1] [0]
$ fish -c 'false; echo "[$status]" "[`echo \$?h`]"'
[1] [`echo $?h`]
Использует тот факт, что `
не является особым в fish
, и что Bourne -подобно оболочкам выполняет дополнительный уровень обработки обратной косой черты внутри `...`
.
Вы также должны иметь возможность использовать eval
, поддерживаемую всеми тремя оболочками, и иметь готовый код для всех трех в некоторой переменной среды, что упростит задачу.
if ($csh || $fish) {
ENV{CHECK_STATUS} = q{perl -e '...' $status};
} else {
ENV{CHECK_STATUS} = q{perl -e '...' "$?"};
}
exec $shell, "-c",...;
и код оболочки будетeval "$CHECK_STATUS"
(имейте в виду, что для csh
$CHECK_STATUS
не должно содержать символов новой строки ).
Is there a compatible way I can tell fish: Please do not warn, I know what I am doing.
Нет. Перекрестная -совместимость скриптов между fish и другими оболочками не имеет значения , потому что fish несовместима .
В большинстве случаев вам нужно выбрать оболочку и написать для нее сценарий с шебангом и всем остальным, наиболее широко доступным вариантом является «/bin/sh».
Затем fish может просто запустить ваш скрипт так же, как скрипт, написанный на python или ruby, или программу, написанную на C.
В некоторых случаях вам нужна оболочка для source
вашего скрипта, потому что вы хотите, чтобы она влияла на изменения среды в вашей оболочке. В этом случае самый простой способ разрешить это — напечатать скрипт
export var=val
линии, а рыба получает его через/path/to/script | source
(и другие раковины аналогичным образом ).