답변:
sh / path / to / script는 새로운 쉘을 생성하고 현재 쉘과 독립적으로 스크립트를 실행합니다. 그만큼source
(.) 명령은 현재 쉘 스크립트의 모든 명령을 호출합니다. exit
예를 들어 스크립트가 호출 되면 현재 쉘이 손실됩니다. 이 때문에 일반적으로 sh를 사용하여 별도의 셸에서 스크립트를 호출하거나 전체 (/로 시작) 또는 상대 경로 (./)를 사용하여 스크립트를 바이너리로 실행하는 것이 더 안전합니다. 바이너리로 호출되면 지정된 인터프리터 (예 : #! / bin / bash)로 실행됩니다.
스크립트가 필요한 파일을 찾을 수 있는지 여부를 아는 경우 스크립트를보고 수행하는 작업을 보는 것 외에는 정답이 없습니다. 옵션으로, 현재 폴더를 떠나지 않고 하위 프로세스에서 스크립트 폴더로 항상 이동할 수 있습니다.
$(cd /wherever/ ; sh script.sh)
(cd /wherever/ ; sh script.sh)
합니까? 왜 $
앞에 있어요?
당신은 확실히 할 수 있습니다 (다른 사람들이 언급 한 조정으로 sudo sh /pathto/script.sh
또는 ./script.sh
). 그러나 나는 시스템 전체를 실행하여 dirs에 대해 걱정하지 않고 여분의 타이핑을 절약하기 위해 몇 가지 작업 중 하나를 수행합니다.
1) Symlink /usr/bin
ln -s /home/username/Scripts/name.sh /usr/bin/name
(명명하게 덮어 쓰기 때문에 중복되는 이름이 없는지 확인하십시오.) 또한 필요에 따라 조정할 수 있도록 개발 폴더에 이름을 유지할 수 있습니다.
2) 스크립트 디렉토리를 경로에 추가하십시오 (.bash_profile 또는 쉘에있는 whatever.profile 사용)
PATH=/path/to/scripts/:$PATH
3) 별명 년대에 만들기 .bash_profile
에 ~/.bash_profile
같은 추가 뭔가 :
alias l="ls -l"
알다시피, 구문은 별명이며, 명령으로 작동하려는 숫자, 명령입니다. 따라서 터미널의 어느 곳에 나 "l"을 입력 ls -l
하면 sudo를 원한다면 alias sl="sudo ls -l"
l 대 sl을 쓸모가 없습니다.
어느 쪽이든, 당신은 입력 sudo nameofscript
하고 당신의 길에있을 수 있습니다. ./ 또는으로 망칠 필요가 없습니다. 또는 sh 등입니다. 먼저 실행 파일로 표시하십시오. : D
필자는 일반적으로 파일 시스템 계층 표준 (FHS)에 따라 스크립트가 속하는 ( /usr/local/bin
또는 /usr/local/sbin/
스크립트가 루트 권한이 필요한 경우) 스크립트를 유지 합니다.
이 두 디렉토리가에 추가되었는지 확인하기 만하면 PATH
됩니다. $HOME/.bashrc
파일 을 편집 하고 다음 줄을 추가하면됩니다.
export PATH=$PATH:/usr/local/sbin:/usr/local/bin
를 통해 루트로 스크립트를 실행할 수 있으려면 sudo
이 디렉토리를의 변수 secure_path
에 추가해야 합니다 /etc/sudoers
.
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
이 파일 편집은 visudo
실수 로 실행 되지 않도록 실행 하여 수행됩니다 .
.bashrc
대신 의미 .bachrc
.
아무도 이걸 제안하지 않은 이유는 확실하지 않지만 매우 쉽습니다! 몇 번 Google에 검색했는데 내가 제공 한 정확한 답변을 찾지 못해 공유 할 것이라고 생각했습니다. 어쨌든 나에게 이것은 최고의 솔루션이지만 가장 쉬운 IMO이지만 다른 사람들은 다르게 느끼고 일할 수 있습니다.
# Place this somewhere in your .bashrc/.bash_profile/etc and edit as you see fit
YOURCOMMAND () {
cd /path/to/directory/containing/your/script/ && ./YOURSCRIPT
}
먼저 'cd'명령으로 스크립트 위치의 디렉토리를 알려줍니다. 그런 다음 '&&'를 사용하여 다음 명령을 실행 한 후 묶을 수 있습니다. 마지막으로 터미널 내에서 실행하는 것처럼 스크립트를 엽니 다! BASH 파일에 저장하고 설정하는 데 5 초가 걸립니다.
이것이 누군가를 도왔기를 바랍니다.
고대의 질문이지만 영원한 질문입니다.
내가 지속적으로 본 해결책은 $HOME/bin
디렉토리 가 있고 디렉토리를 먼저 넣는 것입니다 $PATH
( ~/.bashrc
아직없는 경우 를 통해 ; 일부 시스템 ~/bin
에서는 $PATH
기본적으로 처음입니다 ). 시스템 또는 다른 사용자에게 영향을 미치지 않아야하는 경로 문제를 처리하는 간단한 방법은 스크립트 나 실행 파일에 대한 심볼릭 링크 또는 실행을 위해 스크립트를 삭제하는 것입니다.
스크립트에 고유 한 위치 (흔하지 않은 위치)와 관련하여 찾을 수있는 추가 리소스가 필요한 경우 envvar $BASH_SOURCE
이 사용됩니다. $BASH_SOURCE
의 값에 관계없이 항상 현재 실행중인 스크립트 자체에 대한 절대 경로를 포함합니다.$PWD
.
다음을 고려하세요:
ceverett@burrito:~$ echo $PATH
/home/ceverett/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
우리가 볼 수 있도록 $HOME/bin
먼저입니다 $PATH
, 그래서 넣어대로 ~/bin
실행됩니다. 다음과 같은 데모 스크립트가 있습니다 ~/bin/findme
.
#!/bin/bash
echo "Running from $BASH_SOURCE"
이것은 실행중인 스크립트 위치의 절대 경로를 얻는 데 사용될 수 있습니다.
ceverett@burrito:~$ findme
Running from /home/ceverett/bin/findme
ceverett@burrito:~$ cd foo
ceverett@burrito:~/foo$ findme
Running from /home/ceverett/bin/findme
ceverett@burrito:~/foo$ cd /
ceverett@burrito:/$ findme
Running from /home/ceverett/bin/findme
bin
디렉토리에 링크해야한다고 제안하고 있습니까? 번거로운 것 같습니다. (3) 또한, 위치 독립성을 깨뜨린 다. 경우 /home/desmond/bin/foo
내 스크립트에 대한 링크입니다, 다음 BASH_SOURCE
이 될 것입니다 /home/desmond/bin/foo
,하고 스크립트가 자원을 찾을 수 없습니다.
/bin
있거나 알려진 위치에 /opt
있습니다. (3) 위치 독립성은 상호 의존적 인 개인 스크립트 모음을 작성할 때 이것이 유지하는 것입니다.
. /path/to/script
소스로 사용 하십시오! 그냥 실행하고 싶다면 기간이 전혀 필요하지 않습니다.