Bash 스크립트를 가져온 후 명령을 찾을 수 없습니다

Bash 스크립트를 가져온 후 명령을 찾을 수 없습니다

두 개의 인수 를 cdline받아들이고 디렉터리를 해당 항목으로 변경하는 짧은 bash 스크립트가 있습니다 .PATHSLINELINEPATHS

#!/bin/bash
#command for changing directory to that in the given line...
#or that of the file in the given line

PATHS=$1
LINE=$2
PATH="$(echo "${PATHS}" | sed -n ${LINE}p)"
PATH="$(/home/gohomology/Scripts/pc_macros/file_system/getdir "${PATH}")"
cd ${PATH}

return 1

이를 호출하면 디렉토리인 경우 getdir지정된 경로가 에코되고 , 그렇지 않으면 파일이 포함된 디렉토리가 에코됩니다.

Bash 스크립트가 호출되면 일반적으로 하위 쉘이 생성되므로 스크립트를 호출해도 일반적으로 아무 작업도 수행되지 않는다는 것을 알고 있습니다. 내가 이해하는 바로는 스크립트를 호출하기 전에 추가하거나 .추가 할 수 있는 스크립트를 소싱하는 것이 해결책이어야 합니다.source

이 방법은 디렉토리를 변경하는 데는 작동하지만 그렇게 한 후에는 터미널 에뮬레이터의 다음 결과에 표시된 것처럼 터미널에서 ls또는 같은 다양한 명령을 찾을 수 없습니다.find

gohomology@gohomology:~/Desktop$ find . -name "example_file"
./example_dir/example_file

gohomology@gohomology:~/Desktop$ . cdline "$(!!)" 1
. cdline "$(find . -name "example_file")" 1

gohomology@gohomology:~/Desktop/example_dir$ ls
Command 'ls' is available in the following places
 * /bin/ls
 * /usr/bin/ls
The command could not be located because '/usr/bin:/bin' is not included in the PATH environment variable.
ls: command not found

gohomology@gohomology:~/Desktop/example_dir$ find . -name "example_file"
Command 'find' is available in the following places
 * /bin/find
 * /usr/bin/find
The command could not be located because '/bin:/usr/bin' is not included in the PATH environment variable.
find: command not found

cd명령은 사용 후에도 유효합니다 cdline. 문제는 내가 bash 쉘에 갇혀 있다는 것입니다. 그래서 return 1끝에는 있지만 cdline문제는 지속됩니다.

저는 Ubuntu 22.04.2에서 bash 5.1.16과 gnome-terminal을 실행하고 있습니다.

답변1

문제는 스크립트가 PATH환경 변수를 재정의한다는 것입니다.

PATH="$(echo "${PATHS}" | sed -n ${LINE}p)"
PATH="$(/home/gohomology/Scripts/pc_macros/file_system/getdir "${PATH}")"

매뉴얼 페이지를 보면 bash이 변수가 어떤 용도로 사용되는지 알 수 있습니다.

명령에 대한 검색 경로입니다. 이는 쉘이 명령을 찾는 디렉토리의 콜론으로 구분된 목록입니다(참조:명령 실행다음과 같은).

그리고 나중에명령 실행부분:

이름이 쉘 함수도 내장 함수도 아니고 슬래시를 포함하지 않는 경우,세게 때리다각 요소 검색이 이름의 실행 파일이 포함된 디렉터리입니다.

디렉터리 PATH를 덮어썼고 이제 현재 작업 디렉터리만 포함하므로 bash명령을 어디서 찾을지 알 수 없습니다.

표시되는 오류는 문제를 명확하게 보여줍니다.

The command could not be located because '/usr/bin:/bin' is not included in the PATH environment variable.

당신이 성공한 이유 cd는 이것이 실행 중인 실행 파일이 cd아니라bashbash 내장주문하다.

가장 중요한 것은 PATH스크립트에서 변수 이름을 사용 하지 말고 bash.

답변2

PATH명령을 찾을 위치를 쉘에 알려주는 특수 변수이므로 스크립트에서 임시 변수로 사용하지 마십시오.

~에서man bash.1

명령에 대한 검색 경로입니다. 이는 쉘이 명령을 찾는 콜론으로 구분된 디렉토리 목록입니다(아래 명령 실행 참조). PATH 값의 길이가 0인(빈) 디렉터리 이름은 현재 디렉터리를 나타냅니다. 빈 디렉터리 이름은 인접한 두 개의 콜론이나 선행 또는 후행 콜론으로 나타날 수 있습니다. 기본 경로는 시스템에 따라 다르며 bash를 설치한 관리자가 설정합니다. 일반적인 값은 "/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin"입니다.

관련 정보