특정 bash 기능이 실행되지만 내보내기에 실패합니다("내보내기"도 실패하지 않음).

특정 bash 기능이 실행되지만 내보내기에 실패합니다("내보내기"도 실패하지 않음).

나는 이것을 테스트했습니다 :

~$ test() { echo foo |sed -r s/.*(.)/\\1/g; }
~$ test
o

여태까지는 그런대로 잘됐다. 하지만:

~$ export -f test
~$ bash -c ''
bash: test: line 0: syntax error near unexpected token `('
bash: test: line 0: `test () {  echo foo | sed -r s/.*(.)/\\1/g'
bash: error importing function definition for `test'

sed따옴표를 사용하면 문제가 해결된다는 것을 알고 있습니다 . 그러나 실행 중인 기능을 내보내지 않는 bash는 충격적이며 설명, 규칙 및 예가 필요합니다.

나는 bash가 자체 참조를 처리하기를 원하므로 이것은 단지 버그일 수 있다고 생각합니다.

답변1

귀하의 시스템에 두 가지 버전이 있는 것으로 의심되며 bash에 전화할 때 bash -c ''다른 버전을 호출하는 것입니다. 이 코드 또는 귀하의 코드는 이슈를 생성할 때 변경되었습니다.

내가 그렇게 생각하는 이유는 귀하의 코드가 내 시스템에서 작동하지 않는 것입니다.

$ test() { echo foo |sed -r s/.*(.)/\\1/g; }
bash: syntax error near unexpected token `('

문제는 표현식 주위에 따옴표가 없기 sed때문에 bash는 이를 쉘 표현식으로 해석하려고 한다는 것입니다. 나는 이 동작이 bash 버전 사이에서 변경되고 로그인 쉘 버전이 호출하는 버전 bash과 다른 것으로 추측합니다 . 다음을 수행하여 이를 확인할 수 있습니다.$PATHbash -c ''

$ echo $SHELL
$ which bash

 

또 다른 가능한 원인은 bash의 표현식 평가 동작을 변경하는 일부 셸 옵션을 설정했는데 이러한 옵션이 사용되지 않는 경우입니다 bash -c ''.

 

이 문제를 해결하는 방법은 표현식을 올바르게 인용하면 sed정상적으로 작동합니다.

$ test() { echo foo | sed 's/.*\(.\)/\1/g'; }
$ export -f test
$ bash -c 'test'
o

sed(참고: 내 버전에 유효한 명령이 아니기 때문에 명령을 약간 조정해야 했습니다 sed.)

관련 정보