パスが制限された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。したがって、2つのオプションがあります。

  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がどこにインストールされるかを知っている場合は、フルパスを使用して実行することもできます(より良いアプローチについては説明を参照してください)。


(Rubyをインストールする必要がある場合は、直接インストールする必要がありますが、「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変数に割り当てます。

関連情報