shoptはコマンドラインで動作しますが、スクリプトで実行すると見つかりません


13

私は周りにいくつかのファイルをコピーするスクリプトを書いて、使用しようとしているshopt -s dotglob ドットファイルをコピーするためにCPを有効にするように.jshintし、その他もろもろを。

shopt -s dotglobエラーなしでbashプロンプトで直接実行できます。ただし、スクリプトを実行するとエラーがスローされます。

script.sh: 81: script.sh: shopt: not found

このスクリプトは、bashシェルでshebangヘッダーを使用して実行しています#!/usr/bin/env bash。エラー行:

shopt -s dotglob
cp -r $TEMP/img/* $TARGET/img/
cp -r $TEMP/js/* $TARGET/js/
cp -r $TEMP/less/* $TARGET/less/

グーグルで役に立つものを見つけられない、問題がここにあるという考えはありますか?


リマインダーをありがとう、私ができるすべての選択された答え。まだ良い答えを持っていないこの質問以外の1つ。
尖度

3
よりシンプルな#!/bin/bashヘッダーで試してみてください?
-ish

どのUbuntuバージョンですか?
-ish

2
正しい答えである@izx shoptはbash ビルトインであり、sh持たずshopt、エラーメッセージはからのエラーメッセージのように見えますdash。そのため、ここでのエラーは、bashスクリプトを実行している可能性が高いsh(これはUbuntuのdashデフォルトです)。shへのシンボリックリンクであってもbash、でbashスクリプトをsh実行することはで実行することと同じではありませんbash
ガイラ

回答:


22

コメントから回答を作成するには:

習慣のない多くの人々がのsh代わりにスクリプトを実行していbashます。移植性が懸念される場合、これは良い習慣ですが、多くの人は、理解していないのに見たものをコピーしているのでそうします。

スクリプトをデスクトップ以外のLinuxシステムで実行する必要がない限り(たとえば、Androidデバイスでのシェルスクリプトの実行はまったく異なる)、最初にBash shebang行を使用することをお勧めします。

#!/bin/bash

この行は、スクリプトの最初の行である場合、どのインタープリター(bashやshなどのシェル、Pythonなど)を実行するために呼び出されるかを決定します。上記の行を使用する場合、デフォルトのシェルを使用すると仮定すると、コマンドラインから実行するのと(ほぼ)同じ動作になります。移植性や好みの理由で別のシバン行を使用する場合は、参照するシェルがBashへのシンボリックリンクであっても、参照したシェルのドキュメントを参照する必要があることに注意してください。


5
完全にクロスシステムに #!/usr/bin/env bash するには、使用するbashを知ることがenvの仕事なので(たとえば、パッチを適用した場合)。
-shrikeh

-1

次に示すように、zshを終了してbashをアクティブにする必要があります。

exec bash

コマンドを実行する

source ~/.bashrc

その後、zshをリアクティブにすることができます:

exec zsh

役立つことを願っています


うーん。1)OPがzshを使用していたとは思わない、2)~/.basrcこの場合、AFAIK は起動時にbashによって実行されるため、明示的に呼び出す必要はありません、3)OPのコマンドはどこで実行されますか?4)exec2回使用すると、最初のzshシェルで行った環境の変更が失われます。これは、bashを呼び出すだけでは発生しません。
キセノイド

私の場合、環境の変更を取得する必要があり、変更は持続しました。コンピューターを再起動しただけで、すべての変更が保持されます。多分それは私がセットアップかかわらずにしようとしていたアナコンダにだけ特有である
デヴィッドKabii
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.