画面コマンドでシェル "sh"の代わりにシェル "bash"を使用するにはどうすればよいですか?

画面コマンドでシェル "sh"の代わりにシェル "bash"を使用するにはどうすればよいですか?

開発中のbashスクリプトを1行目から始めて、1行ずつ徹底的にテストする必要があることに気づきました。

コンパニオン端末セッションの開始

垂直分割画面、左側のemacs編集 bashスクリプト、右側のbashスクリプトコマンドの表示、右側の側面編集内容を一目ですぐに確認できます.

bashスクリプト、変数ブロック、連想配列の定義

* '構文エラー: '( '予期しない'エラーメッセージでスクリプトが正しく機能しません。*

研究は、このエラーは、シェルが関連配列を使用できない場合に発生することを示しました。 sh は使用できず、bash は使用できます。

画面を終了して純粋なbashに戻り、bashスクリプトを実行して正しく機能していることを確認してください。

質問:画面コマンドが「sh」ではなく「bash」シェルに依存するようにする方法はありますか?この移行を引き起こすオプションはありますか? --シェル=バシ?基本的にこれが必要です。


修正する

コンスタンチンABが正しい。ご存知のように、とにかくShebanを他の場所に置くことは技術的に必要ですが、スクリプトの最初の行に置くことをお勧めします。もちろん、行の先頭にファイル全体の最初の文字セットになります。そして、デフォルトでは行1に設定し、他のすべての項目は行2以上に残すことをお勧めします。

私の間違いはもちろん、bash shebangを設定しましたが、10行目のコメントセクションの後の11行目に設定したので、1行目には設定しませんでした。

例:

今後

emacs /tmp/test-script.sh (実行ファイルの設定後に以下のように保存)

# Super important stuff in need of being mentioned at the top
#!/bin/bash

declare -A asso_array=(
    [var1]=""
    [var2]="Seems to work"
    [var3]="Test"
    [var4]=""
)
echo ${asso_array[@]}

echo "Hello World!"

/tmp/test-script.shを見る

Every 2.0s: /tmp/test-script.sh    Sat Jan 20 14:02:11 2024

/tmp/test-script.sh: 4: /tmp/test-script.sh: Syntax error: "(" unexpected

後ろに

emacs /tmp/test-script.sh (実行ファイルの設定後に以下のように保存)

#!/bin/bash
# Super important stuff in need of being mentioned at the top

declare -A asso_array=(
    [var1]=""
    [var2]="Seems to work"
    [var3]="Test"
    [var4]=""
)
echo ${asso_array[@]}

echo "Hello World!"

注:shebangを1行目に配置すると、パスエンドポイント(この場合は「bash」)が強調表示されます!

/tmp/test-script.shを見る

Every 2.0s: /tmp/test-script.sh    Sat Jan 20 14:05:11 2024

Test Seems to work
Hello World!

では、学んだ教訓を検討してみましょう。

まずはシバン!に関係なく!

これはbashスクリプトの技術的な必要性です。

それを終了すると、bashスクリプトはデフォルトで失敗します。

答え1

スクリプトをbashスクリプトとしてマークする必要があります。

これは右から始まります。シェルボーンライン」、この場合

#! /bin/bash

これは、スクリプトが実行時にbashによって実行され、他の何も実行されないことをシステムに通知します。

答え2

現在許可されている回答は、OPがBASHスクリプトを実行しようとしていると仮定しています。実際にそうです。しかし、OPの質問は自分に尋ねます。screenしたがって、OPの場合以外の質問に別々に答えるには、次のようにします。

$ screen --help | grep SHELL
-s shell      Shell to execute rather than $SHELL.

E.g.
$ screen -s bash -S myBashySessionName

関連情報