簡単なスクリプトを実行しようとしています。 gitリポジトリをディレクトリに複製し、cd
そのディレクトリに複製してインストールスクリプトを実行します。
スクリプトはMakefileにあります。
しかし、cd
うまくいかないようです。私のインストールスクリプトが見つかりません。
後でスクリプトにパスワードを追加しましたが、ここにcd
入力したディレクトリではなく、スクリプトを実行したディレクトリが表示されますcd
。
問題は何ですか?
git clone http://somerepo ~/some_dir
cd ~/some_dir/
pwd
python myscript.py install
=>
pwd
:/hereIsPathToDirectoryFromWhichIRunTheScript
python: 'setup.py' ファイルを開けません: [Errno 2] そのファイルやディレクトリはありません
にも適用されません./setup.py
。
絶対パスを入力すると、~/some_dir/setup.py
同じフォルダ内のリソースにアクセスしようとするため、後でスクリプトが失敗します。
答え1
makefileを使用しています。 Makefile はスクリプトではなく、各行は新しいシェルで実行されます。これは、行内の環境を変更すると(たとえば、cd
)変更が次の行に伝播されないことを意味します。
解決策は、コマンド間のコンテキストを維持したい場合は、同じ行ですべてのコマンドを実行することです。すべてのコマンドは同じシェルで実行され、環境は保存されます。
たとえば、
target:
git clone http://somerepo ~/some_dir
cd ~/some_dir/ && python myscript.py install
答え2
GNUバージョン3.82以降、Makefileの先頭にmake
追加でき、期待どおりに機能します。
.ONESHELL:
cd folder
文書を読む
答え3
スクリプトは以下で実行されます。サブシェルつまり、$PWD
終了すると「古い」状態になります$PWD
。$PWD
必要なsource
(別名.
)スクリプトを実行する代わりに維持したい場合。しかし、これはMakefileでは動作しません。注文する別のサブシェルで実行:
$ pwd
/home/user
$ cat test.sh
cd /
$ cat Makefile
test:
. ./test.sh && pwd
pwd
$ make test
. ./test.sh && pwd
/
pwd
/home/user