2010-11-26 4 views
0

정말 이상한 문제가 발생했습니다. 어떤 도움도 받으실 수 있습니다.문제점 : Unix에서 올바른 실행 파일을 실행할 수 없습니다.

나는 실행 파일을 컴파일하고 cp를 특정 위치에 가지고있다. 이 실행 파일의 이름은 "qact"입니다. main 함수의 첫 번째 줄에 새로 추가 된 cout 문이 있습니다. 그러나 그 디렉토리에서 바이너리 파일을 실행할 때 나는 그것을 볼 수 없다. 오래 동안 나는 우연히 내가 그 디렉토리에 없다면 출력 할 문자열을 볼 수 있다고 생각한다.

그리고 나중에 내가 그 디렉토리에있을 때만, 실행 된 바이너리 파일이 잘못되었고 그 문자열을 보지 않을 것이라는 것을 알게되었습니다.

내가 실행 파일을 사용할 때 어떤 디렉토리에 있는지, 나는 항상 동일한 결과를 얻으며 올바른 위치입니다. 정말 혼란

..

+0

실행 파일의 이름은 무엇입니까? 그것이 a.out이라고 가정하면, pwd && ./a.out의 결과는 무엇입니까? (./ PATH 문제가 아닌지 확인하는 것이 중요합니다.) –

+0

이 실행 파일의 이름은 "qact" – Johnyy

답변

2

당신이 당신의 $PATH 다른 곳에서 같은 이름의 다른 실행 파일이 있습니까? 그렇다면 해시 테이블을 사용하여 여분의 $PATH 조회 (Command Search and Execution 참조)를 피하기 때문에 bash가 잘못된 실행 파일을 실행하고있을 가능성이 있습니다.

예를 들어 $PATH/opt/local/bin:/usr/bin이고 grep/usr/bin에만 설치되어 있다고 가정합니다. 이제

$ echo $PATH 
/opt/local/bin:/usr/bin 
$ which grep 
/usr/bin/grep 
$ grep --version 
grep (GNU grep) 2.5.1 

을 당신이 당신의 $PATH/usr/bin 이상에 이전하는 /opt/local/bingrep의 최신 버전을 설치한다고 가정 : 당신이 grep을 실행하면, 당신은 확실한 결과를 얻을. which 항상 전체 $PATH 조회 매번 않지만, 배쉬는 해시 테이블을 유지하기 때문에, 배쉬는 여전히 명령이 grep지도 /usr/bin의 하나로 생각 : 당신은이 문제를 진단 할 type builtin을 사용할 수 있습니다

$ which grep 
/opt/local/bin/grep 
$ grep --version 
grep (GNU grep) 2.5.1 
$ /opt/local/bin/grep --version 
GNU grep 2.6.3 

. type은 명령이 쉘 내장 명령인지, 별칭인지, 함수인지, 키워드인지 또는 실행 파일인지 알려줍니다. 후자의 경우 실행 파일의 전체 경로를 알려줍니다.

$ type grep 
grep is hashed (/usr/bin/grep) 

어떻게 해결할 수 있습니까? hash 내장 명령을 사용하여 해시 테이블을 조작 할 수 있습니다 (자세한 내용은 help hash을 입력하십시오). 하나의 항목 (이 경우 grep)을 수정하려는 경우 hash -d grep을 사용하여 "grep에 대한 해시 테이블 항목 삭제"를 수행 할 수 있습니다.이 경우 다음에 grep을 실행하면 전체 $PATH을 예상대로 검색합니다. 새로운 소프트웨어를 많이 설치했거나 $PATH을 변경 한 경우 전체 해시 테이블을 지우려면 hash -r을 사용하여 비워 두십시오.

+0

정보를 제공해 주셔서 감사합니다. "해시"를 시도하면 해시 테이블이 비어 있다고 표시됩니다. "입력"하면 올바른 위치가 표시됩니다. 예,이 실행 파일의 다른 버전이 많이 있습니다. 방금 다른 것을 시도했습니다. PATH = "<올바른 경로>"이므로 다른 경로가 존재하지 않습니다. 그리고 그것은 여전히 ​​나에게 똑같은 일을하고 있습니다. – Johnyy

+0

다른 쉘, bash, ksh에서도 실행 해 보았습니다. – Johnyy

+0

나는 쉘이 명령을 기억하고 해시에 넣을 때 명령을 쉘에 입력 한 후 이해한다. 그러나 그것은 올바른 길입니다. – Johnyy