私はこれがset -x
Bashユーザーがデバッグモードに入ることを知っており、デバッグモードでフルタイムで働くことがBashで発生する可能性がある問題をよりよく処理するのに役立つと思います。
以下の使用に問題がありますset -x
。
ディストリビューション(Ubuntu 16.04)のデフォルトのタブ補完機能を使用してディレクトリ名を完成しようとすると、非常に長く誤った出力が表示されます。
たとえば、次のいずれかのコマンドを実行します$PWD
。/var/www/html/
cd ~/u
[タブ完成完了u
:ulcwe
]
cd ~ && cd u
[タブ完成完了u
:ulcwe
]
どちらの例も非常に長く歪んだ出力を得ます。
+ return 0
+ local -a toks
+ local quoted x tmp
+ _quote_readline_by_ref '~/u' quoted
+ '[' -z '~/u' ']'
+ [[ ~/u == \'* ]]
+ [[ ~/u == \~* ]]
+ printf -v quoted '~%q' /u
+ [[ ~/u == *\\* ]]
+ [[ ~/u == \$* ]]
++ compgen -d -- '~/u'
+ x='~/ulcwe'
+ read -r tmp
+ toks+=("$tmp")
+ read -r tmp
+ [[ -d != -d ]]
+ [[ -n '' ]]
+ [[ 1 -ne 0 ]]
+ compopt -o filenames
+ COMPREPLY+=("${toks[@]}")
+ return 0
lcwe/
lcwe
最後まで注意してください。
上記の出力は、より大きな出力の一部にすぎません。
デバッグモード()でフルタイムで作業を続けますset -x
が、[実行]タブが完了したときにすべての出力が表示されない可能性がありますか?
ベストアンサー1
これは、使用中のシェルのプログラム可能な完了機能によるものです。
のコマンドとファイル名のデフォルトタブが完成したら、bash
次の手順を実行します。
complete -r
~/.bashrc
現在のシェル環境内で、関数呼び出しなどに関連する「クール」(プログラミング可能)完成を排除できます。
プログラム可能なコンプリートをオフにしても、デフォルトのファイル名の完成(質問の例で行ったように)は機能し続けます。
プログラム可能な補完機能は一部のシェルで利用でき、コマンドラインの状態などを確認するコールバック関数を連結することで、ユーザーが次に挿入できる文字列を見つけることができます。たとえば、ssh
thenと入力するSpaceとファイルを解析して接続するホスト名を取得する関数をTab呼び出すことができ、thenと入力すると関数はコマンドを実行して現在のリポジトリで利用可能なブランチを見つけることができます。~/.ssh/config
git checkout
SpaceTabgit
一部のユーザーは、速度や生産性の理由からプログラム可能な完成機能を使用していますが、そうです。set -x
対話型シェルセッションで有効になっている場合、これらの操作は端末からトレース出力を生成します。
Tab私は「背中の後ろから魔法をかぶる」簡単な押さえをしたくないので、どのシェルでもプログラム可能な完成が好きではありません。いろいろな興味深い方法で。私も少し怠惰だと思いますが、それはあくまで私の個人的な考えだけです。