나는 많은 종속성을 설치한 다음 스크립트를 실행하기 위해 첫 번째 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
. 따라서 두 가지 옵션이 있습니다.
양조에 대해 읽어보세요해당 패키지가 설치될 위치를 예측하고 종료 상태를 확인한
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 ...
이 스크립트를 완전히 자동화하려면,명령어 호출 시 오류가 있는지 확인하고 처리한다..
스크립트가 명령 구문 분석을 위해 시스템 경로를 사용하기 전에 시스템 경로를 업데이트하십시오. 이렇게 하면 트릭을 수행할 수 있습니다.
#!/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
.
--verbose
node@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
변수 에 할당합니다 .