bash 스크립트에서 PATH없이 명령을 실행하는 이식 가능한 방법

안드레아스 K

cron은 매우 희박한 PATH를 사용하여 내 bash 스크립트 (백업 스크립트)를 호출합니다 /usr/bin:/usr. 결과적으로 라인은

lvcreate --size 1G --snapshot ...

터미널에서 스크립트를 실행할 때 잘 작동하지만 crontab에서 실행하면 lvcreate를 찾을 수 없습니다. 유사한 문제가 여기 에 설명 되어 있지만 근본적인 문제를 처리하기위한 일반적인 전략에 더 관심이 있습니다.

지금까지 생각 해낸 아이디어 :

  • 빠른 해결 방법으로 스크립트 맨 위에 PATH를 수동으로 설정했습니다. 나는 또한 crontab에서 이것을 할 수 있습니다. 시스템 전체의 PATH가 변경되면 모든 행을 수동으로 업데이트해야 할 수 있습니다.

  • 더 영구적 인 해결책은 내 스크립트에서 절대 경로를 사용하는 것입니다. 예를 들어 호출을 다음과 같이 대체 /sbin/lvcreate --size 1G ...하지만이 문제가 처음 발생한 Ubuntu 서버에서는 작동하지만 Arch Linux ARM (RPi)에서 lvcreate는 / usr / bin /.

  • 내가 할 수 whichPATH가 설정된 모든 명령이 제대로 결과를 저장하고 내 스크립트의 상단에 로컬 별칭을 설정,하지만 그건 나에게 약간의 혼란을 보인다.

  • / etc / environment 소싱에 대해 생각했습니다. 그것은 내 우분투 머신에서 작동하지만 (일반 데비안에서도 생각합니다), 다시 내 RPi에서 시스템 전체 경로가 설정되지 않았습니다. 같은 이유로 (다양한 배포판에서 특정 파일의 위치 및 / 또는 사용에 의존하고 싶지 않음) .bashrc 또는 이와 유사한 것을 사용하는 것을 주저합니다.

그래서 내 질문은 : 스크립트가 설정된 PATH에 의존하지 않고 여전히 이식 가능한 상태로 유지하는 좋은 방법은 무엇입니까? 최첨단 방법이 있습니까?

파일 화재

PATH명시 적으로 설정하십시오 .

스크립트에서 수행하면의 현재 설정에 추가 할 수 있습니다 $PATH. 그러면 거기에있는 모든 것을 존중하고 누락되지 않았는지 확인하려는 것을 추가합니다.

#!/bin/bash
PATH=$PATH:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin
...

PATH실제로 cron 자체의 단점을 해결하기 때문에 crontab 구성에서 설정하는 것이 더 적절할 수 있습니다 (여기서 환경 변수를 설정할 수 있음). 따라서 스크립트를 수정하는 것보다 cron에서 수정하는 것이 더 합리적 일 수 있습니다.

cron에서 설정 한 경우 PATH현재 값을 참조 할 수 없으므로 설정을 완료 해야합니다 .

# my user's crontab
PATH=/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin:/usr/local/sbin

0 2 * * * /usr/local/bin/my2amjob.sh

(시스템 중 일부 또는 사용자 자신이 나중에에 나열된 디렉토리에 설치된 더 간단한 버전에 대해 "재정의"를 설치하는지 여부에 따라 약간 다른 디렉토리 순서가 필요할 수 $PATH있지만 현재 시스템이 설정 한 내용을 확인하고 가능한지 확인하십시오. 그것을 조정하십시오.)

이것이 문제를 해결하기를 바랍니다.

시스템 전체의 PATH가 변경되면 모든 행을 수동으로 업데이트해야 할 수 있습니다.

솔직히 나는 그것에 대해 너무 많이 걱정하지 않을 것입니다. 배포 패키지는 항상 , 또는 아래 /usr/bin바이너리를 설치 하므로 경로 변경없이 항상 액세스 할 수 있습니다. 배포판은 새 디렉토리를 포함 하도록 업데이트 하는 것이 악몽 이라고 오랫동안 생각 했기 때문에 대신 기본 디렉토리에 심볼릭 링크 또는 래퍼 스크립트를 추가하여이를 피했습니다 ./usr/sbin/bin/sbin$PATHbin

직접 설치하는 소프트웨어의 경우 업데이트를 권장 $PATH합니다. 동일한 작업을 수행하고 아래에 심볼릭 링크 또는 래퍼 스크립트를 /usr/local/bin만들고 $PATH가능하면 변경하지 않는 것이 좋습니다.


Linux 배포판은 $PATH과거의 문제 에서 이러한 차이를 만들기 위해 몇 가지 조치를 취하고 있습니다 .

먼저 /usr병합 작업이 있습니다 .이 작업은 /bin에 대한 심볼릭 링크 /usr/bin/sbin에 대한 심볼릭 링크로 바뀝니다 /usr/sbin. 모든 바이너리는 /usr(패키저가 더 쉽게) 아래에 설치 되지만 여전히 심볼릭 링크 와 같은 절대 경로를 통해 참조 /bin/mytool하거나 /sbin/mytool계속 작동 하는 스크립트입니다 . 이것은 Fedora 및 ArchLinux와 같은 배포판에서 채택되었으며 Debian 및 Ubuntu와 같은 다른 배포판은 현재 채택 단계를 거치고 있습니다.

ArchLinux는 한 단계 더 나아간 것처럼 보이며 합병 sbin되어 bin함께 . 따라서 병합이 채택 된 최신 ArchLinux에서는 가능한 네 가지 절대 경로 중 하나로 바이너리를 참조 할 수 있으며 찾을 수 있습니다. 다른 배포판도이 두 번째 병합을 채택할지 여부를 확인합니다.


마지막으로 cron에 대한 더 현대적인 대안을 고려할 수 있습니다. Cron은 경험하는 베어 환경과 같은 몇 가지 특이한 점이 있지만 명령 출력 (로깅 시스템을 사용하는 대신) 및 어색한 명령 줄 이스케이프를 위해 이메일을 사용하기도합니다.

우분투와 아치 리눅스는 패키지를 설치할 필요없이 내장 된 시스템 타이머를 지원합니다.

사용 방법에 대한 훌륭한 기사가있는 ArchLinux 위키를 확인하는 것이 좋습니다. 특히 특정 사용 사례에 매우 유용 할 수있는 특정 레시피가 있는 cron 교체로 systemd Timers를 사용하여 확인하고 싶을 수 있습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

이 명령에 대해 실행 가능한 bash 스크립트를 만드는 방법은 무엇입니까?

분류에서Dev

이식 가능한 스크립트에서 linux bash "sort"명령을 사용하는 방법은 무엇입니까?

분류에서Dev

내 조건이 참인 경우 bash 스크립트에서 여러 명령을 실행하는 방법

분류에서Dev

bash 스크립트에서 명령을 실행하면 (예 : 성능 측면에서) 차이가 있습니까?

분류에서Dev

파이썬 스크립트에서 cygwin을 열고, 명령을 실행하고, 파일의 명령 줄에서 데이터를 가져 오는 방법

분류에서Dev

bash 스크립트에서 pushd 명령을 실행 한 후 readlink 명령이 오작동합니다.

분류에서Dev

&&없이 한 줄에 여러 bash 스크립트를 실행하는 방법

분류에서Dev

Bash 스크립트가 PATH에서 명령을 실행하지 않습니다.

분류에서Dev

Bash 스크립트가 PATH에서 명령을 실행하지 않습니다.

분류에서Dev

bash에서 실행 가능한 스크립트를 실행할 때 점 슬래시를 피하는 방법이 있습니까?

분류에서Dev

레벨에 관계없이 다른 디렉토리에서 명령을 실행하는 Bash 스크립트

분류에서Dev

이전 명령의 프로세스가 완료된 경우에만 다음 명령을 트리거하는 bash 스크립트를 작성하는 방법

분류에서Dev

다른 명령이 실행되기 전에 'clear'bash 명령을 실행하는 방법은 무엇입니까?

분류에서Dev

명령 줄이 작동하는 곳에서 Bash 스크립트가 실패 함

분류에서Dev

.bashrc없이 실행 가능한 스크립트 파일을 만드는 방법

분류에서Dev

이 bash 스크립트가 "sh runserver"로 실행되지 않는 이유는 "source"명령을 인식합니까?

분류에서Dev

Bash 스크립트에서 sudo 명령을 실행하는 방법

분류에서Dev

bash 스크립트와 bash 명령 줄에서 실행할 때 동일한 sed regex (grep 이후)가 실패하는 이유는 무엇입니까?

분류에서Dev

쉘 스크립트에서 commnd stdout의 fd 파일 이름을 가져 오는 이식 가능한 방법

분류에서Dev

cmd에서 명령을 반복하지 않고 파이썬 스크립트를 실행하는 방법

분류에서Dev

파이썬 스크립트에서 arp -a cmd 명령을 실행하는 방법이 있습니까?

분류에서Dev

Bash 스크립트 : 이전 명령을 기다리지 않고 명령을 연속적으로 실행하는 방법은 무엇입니까?

분류에서Dev

Bash 스크립트 : 이전 명령을 기다리지 않고 명령을 연속적으로 실행하는 방법은 무엇입니까?

분류에서Dev

공백이있는 인수가 필요한 명령 줄에서 bash 스크립트를 실행합니다.

분류에서Dev

Bash : 명령을 실행하는 가장 효율적인 방법 (명령어 "might"또는 "might not"이

분류에서Dev

bash 스크립트를 통해 특정 명령을 실행하고 시작에 추가하는 방법

분류에서Dev

쉘 스크립트를 통해 이미 열린 터미널에서 명령을 실행하는 방법

분류에서Dev

오류가없는 한 출력없이 백그라운드에서 명령을 실행하는 방법

분류에서Dev

Bash 스크립트에서 한 줄에 명령을 결합하는 이유는 무엇입니까?

Related 관련 기사

  1. 1

    이 명령에 대해 실행 가능한 bash 스크립트를 만드는 방법은 무엇입니까?

  2. 2

    이식 가능한 스크립트에서 linux bash "sort"명령을 사용하는 방법은 무엇입니까?

  3. 3

    내 조건이 참인 경우 bash 스크립트에서 여러 명령을 실행하는 방법

  4. 4

    bash 스크립트에서 명령을 실행하면 (예 : 성능 측면에서) 차이가 있습니까?

  5. 5

    파이썬 스크립트에서 cygwin을 열고, 명령을 실행하고, 파일의 명령 줄에서 데이터를 가져 오는 방법

  6. 6

    bash 스크립트에서 pushd 명령을 실행 한 후 readlink 명령이 오작동합니다.

  7. 7

    &&없이 한 줄에 여러 bash 스크립트를 실행하는 방법

  8. 8

    Bash 스크립트가 PATH에서 명령을 실행하지 않습니다.

  9. 9

    Bash 스크립트가 PATH에서 명령을 실행하지 않습니다.

  10. 10

    bash에서 실행 가능한 스크립트를 실행할 때 점 슬래시를 피하는 방법이 있습니까?

  11. 11

    레벨에 관계없이 다른 디렉토리에서 명령을 실행하는 Bash 스크립트

  12. 12

    이전 명령의 프로세스가 완료된 경우에만 다음 명령을 트리거하는 bash 스크립트를 작성하는 방법

  13. 13

    다른 명령이 실행되기 전에 'clear'bash 명령을 실행하는 방법은 무엇입니까?

  14. 14

    명령 줄이 작동하는 곳에서 Bash 스크립트가 실패 함

  15. 15

    .bashrc없이 실행 가능한 스크립트 파일을 만드는 방법

  16. 16

    이 bash 스크립트가 "sh runserver"로 실행되지 않는 이유는 "source"명령을 인식합니까?

  17. 17

    Bash 스크립트에서 sudo 명령을 실행하는 방법

  18. 18

    bash 스크립트와 bash 명령 줄에서 실행할 때 동일한 sed regex (grep 이후)가 실패하는 이유는 무엇입니까?

  19. 19

    쉘 스크립트에서 commnd stdout의 fd 파일 이름을 가져 오는 이식 가능한 방법

  20. 20

    cmd에서 명령을 반복하지 않고 파이썬 스크립트를 실행하는 방법

  21. 21

    파이썬 스크립트에서 arp -a cmd 명령을 실행하는 방법이 있습니까?

  22. 22

    Bash 스크립트 : 이전 명령을 기다리지 않고 명령을 연속적으로 실행하는 방법은 무엇입니까?

  23. 23

    Bash 스크립트 : 이전 명령을 기다리지 않고 명령을 연속적으로 실행하는 방법은 무엇입니까?

  24. 24

    공백이있는 인수가 필요한 명령 줄에서 bash 스크립트를 실행합니다.

  25. 25

    Bash : 명령을 실행하는 가장 효율적인 방법 (명령어 "might"또는 "might not"이

  26. 26

    bash 스크립트를 통해 특정 명령을 실행하고 시작에 추가하는 방법

  27. 27

    쉘 스크립트를 통해 이미 열린 터미널에서 명령을 실행하는 방법

  28. 28

    오류가없는 한 출력없이 백그라운드에서 명령을 실행하는 방법

  29. 29

    Bash 스크립트에서 한 줄에 명령을 결합하는 이유는 무엇입니까?

뜨겁다태그

보관