두 개의 인수 를 cdline
받아들이고 디렉터리를 해당 항목으로 변경하는 짧은 bash 스크립트가 있습니다 .PATHS
LINE
LINE
PATHS
#!/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
아니라bash
bash
내장주문하다.
가장 중요한 것은 PATH
스크립트에서 변수 이름을 사용 하지 말고 bash
.
답변2
PATH
명령을 찾을 위치를 쉘에 알려주는 특수 변수이므로 스크립트에서 임시 변수로 사용하지 마십시오.
~에서man bash.1
길
명령에 대한 검색 경로입니다. 이는 쉘이 명령을 찾는 콜론으로 구분된 디렉토리 목록입니다(아래 명령 실행 참조). PATH 값의 길이가 0인(빈) 디렉터리 이름은 현재 디렉터리를 나타냅니다. 빈 디렉터리 이름은 인접한 두 개의 콜론이나 선행 또는 후행 콜론으로 나타날 수 있습니다. 기본 경로는 시스템에 따라 다르며 bash를 설치한 관리자가 설정합니다. 일반적인 값은 "/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin"입니다.