물고기의 불평을 멈추세요: 물고기: $? 종료 상태가 아닙니다. 물고기에서는 $status를 사용하세요.

물고기의 불평을 멈추세요: 물고기: $? 종료 상태가 아닙니다. 물고기에서는 $status를 사용하세요.

아무런 변경 없이 , , csh에서 실행되어야 하는 스크립트를 작성 중입니다 .bashfish

이는 모든 쉘에서 올바른 작업을 수행합니다.

perl -e '$bash=shift;$csh=shift;for(@ARGV){unlink;rmdir;}if($bash=~s/h//){exit$bash;}exit$csh;' "$?h" "$status" $PARALLEL_TMP
                                                                                      

불평 에 더해 fish:

fish: $? is not the exit status. In fish, please use $status.

물고기에게 알릴 수 있는 호환 가능한 방법이 있나요? 경고하지 마세요. 저는 제가 무엇을 하는지 알고 있습니다.

답변1

$ 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`]

`fishBourne과 같은 쉘이 추가 수준의 백슬래시 처리를 수행한다는 사실을 활용하는 데 특별한 것은 없습니다 `...`.

eval또한 세 가지 쉘 모두에서 지원되는 것을 사용할 수 있어야 하며 일부 환경 변수에서 세 가지 쉘 모두에 대해 서로 다른 코드를 준비해야 하므로 작업이 단순화됩니다.

if ($csh || $fish) {
   ENV{CHECK_STATUS} = q{perl -e '...' $status};
} else {
   ENV{CHECK_STATUS} = q{perl -e '...' "$?"};
}
exec $shell, "-c", ...;

쉘 코드는 다음과 같습니다 eval "$CHECK_STATUS"(for에는 개행 문자가 포함되어서는 안 csh됩니다 $CHECK_STATUS).

답변2

물고기에게 알릴 수 있는 호환 가능한 방법이 있나요? 경고하지 마세요. 저는 제가 무엇을 하는지 알고 있습니다.

그렇지 않았습니다. Fish와 다른 쉘 간의 상호 호환 스크립트는 다음과 같습니다.한 가지도 아니고, 왜냐하면 물고기는호환되지 않음.

대부분의 경우 여러분이 원하는 것은 쉘을 선택하고 그에 대한 스크립트를 작성하는 것입니다. 가장 널리 사용 가능한 선택은 "/bin/sh"입니다.

그러면 Fish는 Python이나 Ruby로 작성된 스크립트나 C로 작성된 프로그램처럼 스크립트를 실행할 수 있습니다.

source어떤 경우에는 쉘의 환경 변경 사항에 영향을 주기 위해 스크립트에 쉘이 필요합니다 . 이 경우 가장 쉬운 방법은 스크립트를 인쇄하는 것입니다.

export var=val

/path/to/script | source줄을 서서 물고기가 통과하여(다른 껍질과 유사하게) 물고기가 물고기에게 다가가도록 합니다.

관련 정보