BASHでスペースを含むPATHを代入した変数をダブルクォートで挟まずに[TAB]で補完する
Abstract
export long_name_variable='/mnt/g/My Drive' #スペースを含むPATH
としてあるとき,
shopt -s direxpand
としておくと,
cd $long_name_variable/ #スラッシュを追加し,[TAB]を押す
# このとき
# cd $long_n
# ↑この時点で他に候補がなければ[TAB]を押すと変数名が補完され,
# cd $long_name_variable
# となる
のように,スラッシュを追加し[TAB]キーを押すと,環境変数がスペースを考慮されたうえで展開されて
cd /mnt/g/My\ Drive
となり,cd "$long_name_variable"
と打たなくていい.
(ダブルクォート内では変数名の[TAB]による補完ができない)
Background
export long_name_variable='/mnt/g/My Drive'
cd $long_n#[TAB PRESS]
のようにTABキーを押せば,ほかに候補がない場合,
cd $long_name_variable
となってくれる.しかしこのまま[ENTER]
を押せば,
cd /mnt/g/My Drive
と展開されてしまい,cd
の引数に/mnt/g/My
とDrive
の二つが指定されることになってしまう.
これを回避する方法の一つとして,
cd "$long_name_variable"
のようにダブルクォートで挟むのが定石だが,
(環境に依るかもしれないが)ダブルクォートの途中で[TAB]で変数名を補完しようとしてもできない
(別の環境ではできてた気がするので,設定方法知っている方いたらコメントで教えていただけると助かります)
cd "$long_n #ここで[TAB]を押しても無反応
このため何かしらのワークアラウンドを探していた
Solution: shopt -s direxpand
本操作は以下の記事を基にした
shopt -s direxpand
としておくと,
cd $long_name_variable/ #スラッシュを追加し,[TAB]を押す
[TAB]キーを押すと,環境変数が展開されて
cd /mnt/g/My\ Drive
となり,cd "$long_name_variable"
と打たなくていい.
これは他にもダブルクォートと補完に関する問題にも関係し,
例えば
cd "$variable"/somewhere #ここで[TAB]
とすると,ダブルクォートが消えてしまう問題があったが,direxpand
をon
にしておくことで,
変数がスペースが考慮されて展開(\
がスペースの前に追加される)のでこの問題も解消する.