경로가 제한된 Bash 스크립트

경로가 제한된 Bash 스크립트

나는 많은 종속성을 설치한 다음 스크립트를 실행하기 위해 첫 번째 bash 스크립트를 작성하려고 합니다.

저는 개발자입니다. 즉, 홈브류, 루비, 노드 등과 같은 도구가 많이 설치되어 있고 사용자가 OSX를 새로 설치했다는 뜻입니다. 나는 이 스크립트가 OSX를 새로 설치하는 모든 신규 사용자에게 작동하기를 원합니다.

PATH사용자가 새로 설치하는 것을 시뮬레이션하기 위해 디버깅 목적으로 스크립트 시작 부분에 간단한 프레임을 내보내 려고 합니다 .

node내가 직면한 문제는 실제로 그것을 참조하는 방법 이나 npm실행할 수 있도록 구체적으로 설명하는 방법을 잘 모르겠다는 것입니다 npm install.

echo광산이 생산하는 것을 볼 수 있습니다 . node/npm을 올바르게 설치하고 실행하는 방법에 대한 아이디어가 있습니까?

#!/bin/bash
# Install necessary deps and runs script to create user for the DEV environment.
# Mainly used for non engineers to be able to create their own emails.

export PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin::/usr/local
echo $PATH

# Install homebrew
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

# Install node 8
/usr/local/bin/brew install node@8

# Install npm - https://stackoverflow.com/a/36631430/222403
/usr/local/bin/brew postinstall node@8

echo /usr/local/bin/brew --prefix node@8 = $(/usr/local/bin/brew --prefix node@8)
echo which node = $(which node) --> PRINTS which node =
echo which node@8 = $(which node@8) --> PRINTS which node@8 =
echo which npm = $(which npm) --> prints which npm =
....

답변1

Brew는 일반적으로 파일 /usr/local/Cellar/usr/local/bin.

$PATH새 상자 에는 없을 수도 있습니다 /usr/local/bin. 따라서 두 가지 옵션이 있습니다.

  1. 양조에 대해 읽어보세요해당 패키지가 설치될 위치를 예측하고 종료 상태를 확인한 brew install ...다음 절대 경로를 포함하도록 스크립트를 변경하여 Brew가 설치한 새 바이너리/스크립트의 경로를 하드코딩합니다.

    brew install foo작동 한다면 foo바이너리를 호출에 사용할 수 있어야 합니다 /usr/local/bin/foo.

    작동한다면 다음과 같은 단서를 얻을 수 있습니다 brew install.

    /usr/local/bin/brew install node@8
    status=$(echo $?)
    if [[ "$status" -ne 0 ]]; then
        echo "Brew install node failed!"
        exit 1
    fi
    ...
    

    이 스크립트를 완전히 자동화하려면,명령어 호출 시 오류가 있는지 확인하고 처리한다..

  2. 스크립트가 명령 구문 분석을 위해 시스템 경로를 사용하기 전에 시스템 경로를 업데이트하십시오. 이렇게 하면 트릭을 수행할 수 있습니다.

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

    이는 사용자의 bash 환경에 의존하지 않으며 which위 명령을 수정해야 합니다. 하지만 생각해 보세요. 새 상자가 /usr/local/bin필요할까요 $PATH?

답변2

가정:내 생각에는 일단 Node와 NPM을 설치하려고 하면 스크립트의 실제 경로를 모르고 실행하려고 한다는 것입니다. 이것이 내 대답의 기초입니다.


노드 및 npm 호출:

이 줄이 트릭을 수행해야 합니다.

$(which <command>) <command arguments>

따라서 일부 NPM 패키지의 경우 다음을 사용할 수 있습니다.

$(which npm) install <packagename>

이 때문입니다전체 경로실행 파일의 이름(bash에서 다른 항목 앞에 나열되어 있는 경우)이 실행됩니다. "$()" 구조는 실제로 실행 파일 위치를 bash로 대체합니다.

예:

$(which yes) IT WORKS!

중단될 때까지 화면에 "IT WORKS!"가 반복적으로 인쇄됩니다.

설명에서 언급했듯이 Node 및 NPM이 어디에 설치될지 알고 있다면 전체 경로를 사용하여 실행할 수도 있습니다(더 나은 접근 방법은 설명을 참조하세요).


(루비를 설치해야 한다면 직접 설치해야 하지만 "curl" 라인과 같은 작업을 수행하면 됩니다.)


노트:스크립트의 $PATH 변수에 이미 "/usr/local/bin" 및 "/usr/bin"이 있으므로 이상한 일이 발생하지 않는 한 전체 콘텐츠 경로를 지정하지 않고 "ruby" 및 "brew"를 실행할 수 있습니다.

답변3

다음에 추가: 찾는 방법 node.

--verbosenode@8을 제거하고 옵션을 사용하여 node@8을 다시 설치하는 것이 좋습니다 .

brew uninstall node@8
brew install --verbose node@8

설치 단계가 표시될 수 있습니다. 출력에서 위치 node와 해당 심볼릭 링크를 찾을 수 있기를 바랍니다.

또는,

명령을 사용하여 노드 패키지에서 설치된 파일의 경로를 찾을 수 있습니다 brew list.

brew list node@8

설치된 모든 파일이 표시됩니다.

그런 다음 GNU를 사용할 수 있으면 find특정 파일에 대한 심볼릭 링크를 찾을 수 있습니다.

find -L /dir/to/start/find -samefile /the/path/of/the/original/file

Brew에서 생성된 노드에 대한 심볼릭 링크를 찾으면 $PATH에 경로를 추가합니다. 심볼릭 링크가 존재하지 않는 경우 직접 생성하거나 원본 파일의 경로를 추가해야 합니다 node.

질문에 대한 오해로 인한 답변: 사용방법 which및 변수

다음과 같이 변수에 경로를 할당합니다.

#!/bin/bash

NODE=`which node`
NPM=`which npm`

echo "Node.js path: ${NODE}"
$NODE -v

echo "npm path: ${NPM}"
$NPM -v

노트: `which node`$(which node)역따옴표(역따옴표) 및 $()는 결과를 반환합니다 .

which명령의 전체 경로, 즉 `which node`node.js의 설치 경로를 반환합니다. 그리고 $NODE변수 에 할당합니다 .

관련 정보