0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

BASHでスペースを含むPATHを代入した変数をダブルクォートで挟まずに[TAB]で補完する

Last updated at Posted at 2022-10-27

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/MyDriveの二つが指定されることになってしまう.
これを回避する方法の一つとして,

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]

とすると,ダブルクォートが消えてしまう問題があったが,direxpandonにしておくことで,
変数がスペースが考慮されて展開(\がスペースの前に追加される)のでこの問題も解消する.

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?