What is bash option `-x`

※ 2014/12/17追記


man bashを見ると

       ...
       -x file
              True if file exists and is executable.
       ...

となっているが実際に$ bash -x script.shとすると実行内容がエコーされる

なんでだろうと思ったら「CONDITIONAL EXPRESSIONS(条件式)」のコーナーに書いてあった

実行内容がエコーされる-xオプションは別にありそう

CONDITIONAL EXPRESSIONS
       Conditional  expressions  are  used  by the [[ compound command and the test and [
       builtin commands to test file attributes and perform string and arithmetic compar-
       isons.   Expressions  are formed from the following unary or binary primaries.  If
       any file argument to one of the primaries is of  the  form  /dev/fd/n,  then  file
       descriptor  n  is checked.  If the file argument to one of the primaries is one of
       /dev/stdin, /dev/stdout, or /dev/stderr, file descriptor 0, 1, or 2, respectively,
       is checked.
       ...
       -x file
              True if file exists and is executable.
       ...

実行内容を出してくれる方の-xは実は組み込みコマンドのsetコマンドにある、-oオプションで指定できるxtraceのことだった!

SHELL BUILTIN COMMANDS
       ...
       set [--abefhkmnptuvxBCHP] [-o option] [arg ...]
       ...
              -o option-name
              ...
                      xtrace  Same as -x.
                      ...
              -x      After expanding each simple command,  for  command,  case  command,
                      select  command,  or  arithmetic  for command, display the expanded
                      value of PS4, followed by the command and its expanded arguments or
                      associated word list.

はぁ〜なるほどそういうことだったんですね

つまりタイトルのWhat is bash option `-x` は厳密には正しくないんですね

シェルにオプションを設定するためのsetコマンドのオプションだったのですから…(ややこしい)


typeコマンドで指定したコマンドが組み込みコマンドなのか、エイリアスなのか等わかるようです

$ type set
set is a shell builtin
$ type git
git is /usr/local/bin/git

私はlsをエイリアスしているので以下のように表示される

$ type ls
ls is an alias for ls -FG

typeコマンド自身は…組み込みコマンド!

$ type type
type is a shell builtin

2014/12/17

表題のbash -xの-xはtestコマンドの-xとのツッコミをいただきました!
https://twitter.com/masutaka/status/544887500771446784

$ type [
[ is a shell builtin

おおお…

if [ hoge.txt ]; then
	echo "hello"
fi

if のあとに書くのはコマンド列(list)

そこに書いたとき式ぽく見えるように test と同等の [ が用意されている。(なお test を [ で起動すると、最後の引数として ] が必要になる)

構文上の閉じ括弧に見えるけど実はただの引数

というお話も頂きました 圧倒的感謝