質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

2回答

4293閲覧

bashの入力受付のreadコマンドで補完機能を使いたい

ratetail

総合スコア32

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

1グッド

1クリップ

投稿2017/11/18 12:25

###前提・実現したいこと
環境
VMWare上のCentOS7.3 r1611
GNU bash, バージョン 4.2.46(2)-release (x86_64-redhat-linux-gnu)

readコマンドでディレクトリパスを入力させる際
タブキーで入力補完させたい。

###該当のソースコード

bash

1read -p "ディレクトリを指定してください。:" tempDirPath

###試したこと
readコマンドのオプションや、completeコマンドで出来るのかと試してみたのですが
タブキーを押しても、タブコードが入力されてしまい、補完できませんでした。

どのような情報でも結構ですので、よろしくお願いします。

DrqYuto👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

Bash

1read -e -p "ディレクトリを指定してください。:" tempDirPath

入力が端末からの場合に、Readlineを有効にしてくれるオプション-eをつけるとできます。

投稿2017/11/18 13:55

Takahito_Ogawa

総合スコア229

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KSwordOfHaste

2017/11/18 14:04

あわわ・・・しょうもない回答したあとにこんな的確な回答がw;
ratetail

2017/11/18 15:11

Takahito_Ogawaさん、KSwordOfHasteさん ご回答ありがとうございます。 「-e」オプションで希望通り動作できました。 ヘルプを読んではいたのですが「readline」が、そういう動作をするものという認識が全くありませんでした。 Web検索でも「-e」を使用したものにたどり着けなかったのですが、ものすごくシンプルで当たり前すぎたからなのでしょうかね^^; KSwordOfHasteさん どのような回答でもご助言いただけるだけで助かりますので、今後とも、またよろしくお願いします。
KSwordOfHaste

2017/11/18 15:42

> 最初から英語で検索をかけた方が 自分はスラスラ読める程英語が得意ではないのでヒットしそうな予感がすれば先に日本語のキーワードで調べます。ただおっしゃるように英語で検索掛けた方が豊富な情報があるのは確かですよね…
guest

0

追記:Takahito_Ogawaさんの回答を拝見しました。
こんなことができるんですね!
自分の回答は取り消します( ;


こうしたもののを調べたことがないので外してたらスミマセン

bashがコマンドを入力する際にはコマンド名の補完やコマンド引数のパス名の補完をやってくれますが、readでは行われない気がします。それはreadの目的が「コマンドやファイル名を入力するものではなく」「文字列を入力するためのもの」だからだと思います。つまり目的が違う機能なのだと思います。

bashのmanなどみるとreadはCのライブラリーであるRaedlineを使っているらしいことが伺えます。もしお望みのことをするコマンドがどこかにないとすると(あるのかも知れませんが、自分は知らないです)ttyのモードをcooked->rawにした上で1文字ずつ処理をプログラムが必要になると思います。

(1) sttyでttyモードを変更し、補完をshellやperlで書く
(2) linuxのtty設定用関数でttyモードを変更し、Cで補完処理を書く
(3) C以外の何かの言語を使って書く
(4) emacsなどに慣れているならemacsでスクリプト全体を書いてしまう
たしかemacsにはファイル名を補完してくれるemacs-lispの関数があった気がします。

といった方法が考えらえますが(2)(3)を想定し「linux tty 文字単位 入力」で検索して少し調べてみたところ以下のようなページがヒットしました。

C
http://www.darkhorse.mydns.jp/blog/getch_utf8

Ruby
https://qiita.com/ksss/items/9c8a237f452cd8aa7c11

自前で作るのは少々めんどうそうなのでどこかにファイル名補間をしてくれるようなコマンドがあればよいのですが、残念ながら自分は知りません。

投稿2017/11/18 14:03

編集2019/05/25 09:50
KSwordOfHaste

総合スコア18392

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問