다른 디렉토리에서 스크립트 실행


11

종종 실행하려는 스크립트가 현재 작업 디렉토리에 없으며 실제로 떠나고 싶지 않습니다.

다른 디렉토리에서 스크립트 (BASH, Perl 등)를 실행하는 것이 좋습니까? 그들은 보통 제대로 운영하는 데 필요한 모든 것을 찾을 수 있습니까?

그렇다면 "먼"스크립트를 실행하는 가장 좋은 방법은 무엇입니까? 그렇습니까

. /path/to/script

또는

sh /path/to/script

sudo그런 경우 어떻게 사용 합니까? 예를 들어, 작동하지 않습니다.

sudo . /path/to/script

스크립트 를 . /path/to/script 소스로 사용 하십시오! 그냥 실행하고 싶다면 기간이 전혀 필요하지 않습니다.
gniourf_gniourf

답변:


14

sh / path / to / script는 새로운 쉘을 생성하고 현재 쉘과 독립적으로 스크립트를 실행합니다. 그만큼source(.) 명령은 현재 쉘 스크립트의 모든 명령을 호출합니다. exit예를 들어 스크립트가 호출 되면 현재 쉘이 손실됩니다. 이 때문에 일반적으로 sh를 사용하여 별도의 셸에서 스크립트를 호출하거나 전체 (/로 시작) 또는 상대 경로 (./)를 사용하여 스크립트를 바이너리로 실행하는 것이 더 안전합니다. 바이너리로 호출되면 지정된 인터프리터 (예 : #! / bin / bash)로 실행됩니다.

스크립트가 필요한 파일을 찾을 수 있는지 여부를 아는 경우 스크립트를보고 수행하는 작업을 보는 것 외에는 정답이 없습니다. 옵션으로, 현재 폴더를 떠나지 않고 하위 프로세스에서 스크립트 폴더로 항상 이동할 수 있습니다.

$(cd /wherever/ ; sh script.sh)

3
당신은 의미 (cd /wherever/ ; sh script.sh)합니까? 왜 $앞에 있어요?
G-Man, 'Reinstate

7

당신은 확실히 할 수 있습니다 (다른 사람들이 언급 한 조정으로 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


나는 옵션 2를 강력히 추천합니다.
Bernhard

왜?, 그것은 최선의 방법입니까 아니면 그냥 맛입니까?
세르지오

3

나는 보통 네가 말하는 것처럼

sh /path/to/script

루트 / 수퍼 유저로 실행하려면

sudo sh /path/to/script

현재 디렉토리는 스크립트에서 사용자가 동일한 폴더에 있다고 가정하는 경우에만 중요합니다. 나는 대부분의 스크립트가 이것을하지 않는다고 가정하고 위와 같이 실행하도록 저장됩니다.


작품은 secure_path는은 / etc /의 sudoers 파일에 설정하지 않을 경우
l1zard

3

필자는 일반적으로 파일 시스템 계층 표준 (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.
gniourf_gniourf

0

아무도 제안하지 않으면 리눅스에서 이와 같이 작동하는지 확실하지 않습니다. 그러나 ././를 사용하여 디렉토리로 돌아가는 대신. 따옴표를 사용하여 절대 경로를 줄 수 있습니까? 어쩌면 실제로 그것을 생각하기 위해 전체 드라이브에 액세스 할 수없는 경우도 있습니다.


0

주위에 스크립트가 있으면 자주 실행해야하고 리소스를 찾기 위해 해당 위치에 의존하는 경우 명령을 이와 같은 별칭으로 결합하여 쉽게 수행 할 수 있습니다.

alias run-script="cd /home/user/path/to/script/ && bash script.sh"

이런 식으로 작동시키기 위해 다른 것을 변경할 필요가 없습니다.


0

아무도 이걸 제안하지 않은 이유는 확실하지 않지만 매우 쉽습니다! 몇 번 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 초가 걸립니다.

이것이 누군가를 도왔기를 바랍니다.


-1

고대의 질문이지만 영원한 질문입니다.

내가 지속적으로 본 해결책은 $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

(1) 이것은 유용한 정보 인 것처럼 보이지만, 질문은 자신의 위치와 관련하여 리소스를 사용하는 스크립트 를 작성 하는 방법을 묻지 않았습니다 . 스크립트 실행에 대해 물었습니다. (2) 두 번째 단락이 어떻게 문제를 다루는 지 잘 모르겠습니다. 스크립트를 작성하고 Desmond가 스크립트를 실행하려면 개인 bin디렉토리에 링크해야한다고 제안하고 있습니까? 번거로운 것 같습니다. (3) 또한, 위치 독립성을 깨뜨린 다. 경우 /home/desmond/bin/foo내 스크립트에 대한 링크입니다, 다음 BASH_SOURCE이 될 것입니다 /home/desmond/bin/foo,하고 스크립트가 자원을 찾을 수 없습니다.
G-Man, 'Reinstate

@ G-Man (1) 사용자가 많은 컨텍스트를 제공하지 않았습니다. 지난 30 년 동안이 질문에 대해 질문을 받았을 때마다 사소한 작업을 자동화하기 위해 자신의 스크립트와 다른 스크립트를 혼합하여 실행하는 사용자 (일반적으로 새로운 sysop 또는 개발자)라는 맥락에서 항상 답했습니다. 방법. 이것은 않는 사용자 묻는 부분에 스크립트 지식의 비트를 가정합니다. (2) 시스템 전체 스크립트는 일반적으로에 설치되어 /bin있거나 알려진 위치에 /opt있습니다. (3) 위치 독립성은 상호 의존적 인 개인 스크립트 모음을 작성할 때 이것이 유지하는 것입니다.
zxq9
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.