Bash — echo --help でヘルプが表示されない理由から考える シェルの bultin コマンドなどなど

## 動作環境

docker + ubuntu + bash

```
docker run --interactive --tty ubuntu /bin/bash
```

もしくは

```
docker run --interactive ubuntu
```

( [Docker— docker run -it の -t を抜くとどうなるか ( tty 指定なしの interactive モード ) - Qiita](https://qiita.com/YumaInaura/items/b8d605f17d98572bb865) )

## echo --help

ヘルプが表示されるのではなく、 `--help` という文字列が表示される。

```
$ echo --help

--help
```

当たり前のように思えるが？

## /bin/echo --help

こちらはhelpが表示される

```
$ /bin/echo --help

Usage: /bin/echo [SHORT-OPTION]... [STRING]...
  or:  /bin/echo LONG-OPTION
Echo the STRING(s) to standard output.

  -n             do not output the trailing newline
  -e             enable interpretation of backslash escapes
  -E             disable interpretation of backslash escapes (default)
      --help     display this help and exit
      --version  output version information and exitEcho the STRING(s) to standard output.

...

NOTE: your shell may have its own version of echo, which usually supersedes
the version described here.  Please refer to your shell's documentation
for details about the options it supports.

GNU coreutils online help: <http://www.gnu.org/software/coreutils/>
Report echo translation bugs to <http://translationproject.org/team/>
Full documentation at: <http://www.gnu.org/software/coreutils/echo>
or available locally via: info '(coreutils) echo invocation'

```

丁寧に「あなたのシェルは独自バージョンのechoを使ってるかもしれない」と書かれている。

GNU の `echo` コマンドは `--help` とか `--version` などのコマンドオプションをサポートしているらしい。

## which してみる

`/bin/echo` が使われているような気がするが？

```
$ which echo

/bin/echo
```

which は builtin コマンドを掴まえないみたいだ。

>　whichコマンドでは、「cd」や「echo」のようなシェルのビルトインコマンドは検索できません。


[【 which 】コマンド――実行コマンドのフルパスを表示する：Linux基本コマンドTips（94） - ＠IT](http://www.atmarkit.co.jp/ait/articles/1703/16/news020.html#sample3)

 `type` コマンドを打つ必要がある様子。

```
$ type echo

echo is a shell builtin
```


## builtin って何よ？

シェルの組み込みコマンドで、実行形式の外部プログラム ( `/bin/echo` とか ) よりも速いらしい。

>Shell builtins work significantly faster than external programs, because there is no program loading overhead. However, their code is inherently present in the shell, and thus modifying or updating them requires modifications to the shell.

[Shell builtin - Wikipedia](https://en.wikipedia.org/wiki/Shell_builtin)



## enable

enable コマンドで builin を無効化しても、ヘルプが表示されるようになる。

```
$ enable -n echo
$ echo --help

Usage: /bin/echo [SHORT-OPTION]... [STRING]...
  or:  /bin/echo LONG-OPTION
Echo the STRING(s) to standard output.

...
```

`type` コマンドの結果も変わっているのが分かる。

```
$ type echo

echo is hashed (/bin/echo)
```

## enable って何よ？

shell の builin を有効化/無効化するコマンドらしい。

```
enable --help
enable: enable [-a] [-dnps] [-f filename] [name ...]
    Enable and disable shell builtins.

    Enables and disables builtin shell commands.  Disabling allows you to
    execute a disk command which has the same name as a shell builtin
    without using a full pathname.

    Options:
      -a	print a list of builtins showing whether or not each is enabled
      -n	disable each NAME or display a list of disabled builtins
      -p	print the list of builtins in a reusable format
      -s	print only the names of Posix `special' builtins
```

## Gist

- [Why echo --help does not show help? the differences between shell builtin command and GNU](https://gist.github.com/YumaInaura/4a587e85ce62f1275c238839a061193d)

## 参考

- [bash - why 'echo --help' doesn't give me help page of echo? - Unix & Linux Stack Exchange](https://unix.stackexchange.com/questions/153660/why-echo-help-doesnt-give-me-help-page-of-echo)









<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->