이 소프트 링크가 예상대로 작동하지 않는 이유는 무엇입니까?


11
bash4.3 # pwd
/bin
bash4.3 # ll sh
lrwxrwxrwx. 1   root    root    4   May 17 22:22 sh -> bash
bash4.3 # ll bash
-rwxr-xr-x. 1   root    root    1072056 May 17 22:22 bash
bash4.3 # bash
bash4.3 # sh
sh-4.3#

내 OS는 fedora 24 (기본 그놈 버전)입니다.

이 예에서, 우리는 알 수 있습니다 : 아래 /bin, bash바이너리 실행 파일입니다; sh에 대한 소프트 링크 bash입니다.

내 지식으로는와 type bash and press enter동일한 결과에 정확하게 영향을 미칩니다 type sh and press enter.

type bash and press enter, 나는 [root@localhost bin]#예상대로 얻는다 .

그러나, type sh and press enter내가 놀랍게도 얻을 수 sh-4.3#있습니다.

원인이 무엇입니까?


이미지로 쉽게 SE 편집기에 복사하여 붙여 넣을 수있는 텍스트는 상당히 성가 시므로 수행하지 마십시오. 대신 터미널에서 텍스트를 선택하고 CTRL-SHIFT-C를 누르십시오.
cat

답변:


25

그것은 문서화 된 기능입니다.

이라는 심볼릭 링크를 통해 bash를 실행하면 shbash가 sh호환 모드 에서 시작 됩니다.

보낸 사람 man bash:

bash가 sh라는 이름으로 호출되면 POSIX 표준도 준수하면서 sh의 히스토리 버전 시작 동작을 최대한 유사하게 모방하려고 시도합니다. 대화식 로그인 셸 또는 --login 옵션을 사용하는 비 대화식 셸로 호출되면 먼저 / etc / profile 및 ~ / .profile의 명령을 순서대로 읽고 실행하려고 시도합니다. --noprofile 옵션을 사용하면이 동작을 막을 수 있습니다. 이름이 sh 인 대화식 쉘로 호출되면, bash는 변수 ENV를 찾고 정의 된 경우 해당 값을 확장 한 다음 확장 된 값을 읽고 실행할 파일 이름으로 사용합니다. sh로 호출 된 쉘은 다른 시작 파일에서 명령을 읽고 실행하려고 시도하지 않으므로 --rcfile 옵션은 적용되지 않습니다. sh라는 이름으로 호출 된 비 대화식 쉘은 다른 시작 파일을 읽으려고 시도하지 않습니다. sh로 호출하면 시작 파일을 읽은 후 bash가 posix 모드로 들어갑니다.

프로그램은 어떤 이름으로 시작했는지 어떻게 알 수 있습니까?

AC 프로그램 인 경우 검사 할 수 있습니다 argv[0]. 쉘 또는 perl 스크립트 인 경우 검사 할 수 있습니다 $0.

예를 들어,이 간단한 쉘 스크립트를 생각해 봅시다 :

$ cat utc
#!/bin/sh
case "${0##*/}" in
        utc) date -u ;;
        et) TZ=US/Eastern date ;;
esac

$0스크립트가 호출 된 이름입니다. ${0##*/}디렉토리 이름이 제거 된 상태에서 스크립트가 호출 된 이름입니다.

이 심볼릭 링크를 만들어 봅시다 :

ln -s utc et

그래서, utc그리고 et모두 동일한 실행 파일을 실행 있지만 다른 결과를 제공합니다. 로 실행하면 utc표준시가 출력됩니다. 로 실행하면 et미국 동부 시간이 출력됩니다. 예를 들면 다음과 같습니다.

$ utc
Wed Jul 20 18:14:18 UTC 2016
$ et
Wed Jul 20 14:14:20 EDT 2016

4
OP는 통화가 동일 할 것으로 기대하기 때문에 이것이 가능한 방법을 추가하고 싶을 수도 있습니다. ( argv[0], obvs)
궤도에서 가벼움 레이스

@LightnessRacesinOrbit 좋은 생각입니다. 예를 추가했습니다.
John1024

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.