59827


# 環境

  * Xubuntu 18.04 LTS
  * bash 4.4.20

# やりたいこと

シェルスクリプトの標準出力/標準エラー出力をファイルに出力したいです。

hoge.sh

[code]

    #!/bin/bash -ex
    
    echo "hello"
    
[/code]

# 起きたこと

shellscriptを直接実行したときと、bashコマンドで実行したときで、出力されたファイルの中身が異なっていました。  
具体的には、`bash -x`で表示される実行コマンドが、ファイルに出力されていませんでした。

### 実行したコマンド

[code]

    $ ./hoge.sh > out1.txt 2>&1
    
    $ /bin/bash ./hoge.sh > out2.txt 2>&1
    
    
[/code]

### ファイルの中身

out1.txt

[code]

    + echo hello
    hello
    
[/code]

out2.txt

[code]

    hello
    
[/code]

# 質問

`bash hoge.sh`だと、`bash -x`の結果がファイルに出力されないのは、なぜでしょうか？  
また、どうすれば`bash hoge.sh`でも出力できるようになるでしょうか？

※`bash`コマンドを使う必要性はありませんが、興味として知っておきたいです。


CC BY-SA 4.0
2019-10-20T10:01:56.123
59822
2020-12-08T03:03:49.193
2020-12-08T03:03:49.193
19524
19524
question
linux bash
`/bin/bash ./hoge.sh > out1.txt 2>&1`では、`bash -x`の結果がファイルに出力されませんでした。なぜでしょうか？


シェバンを解釈するのは`execve`のようです。

[シバン (Unix)出典:
フリー百科事典『ウィキペディア（Wikipedia）](https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%90%E3%83%B3_\(Unix\))の補足を参照のこと

`/bin/bash ./hoge.sh`ではexecveを呼び出されず、-xが効いていません。

straceで調べてみましたがやはり、`execve`で`hoge.sh`になり替わっていませんでした。

`/bin/bash ./hoge.sh`は`hoge.sh`を単なるデータとして読み込んでいるようです。

* * *

hoge.sh

[code]

    #!/bin/ls -l
    echo hello
    
[/code]

をbashに渡すと、`hello`と出力されますが、`./hoge.sh`だと`ls -l`が実行されます。


CC BY-SA 4.0
2019-10-20T12:05:28.910
59827
2019-10-20T12:28:38.080
2019-10-20T12:28:38.080
35558
35558
59822
answer