私は多くの依存関係をインストールし、スクリプトを実行するための最初の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
。したがって、2つのオプションがあります。
醸造について読むそのパッケージがインストールされる場所を予測し、終了ステータスを確認し、絶対パスを含めるようにスクリプトを
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がどこにインストールされるかを知っている場合は、フルパスを使用して実行することもできます(より良いアプローチについては説明を参照してください)。
(Rubyをインストールする必要がある場合は、直接インストールする必要がありますが、「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
変数に割り当てます。