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

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

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

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

解決済

キーが文字列である仮想配列を外部ファイルを元に生成したい.

Sme
Sme

総合スコア23

bash

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

1回答

0リアクション

0クリップ

190閲覧

投稿2022/08/09 18:38

編集2022/08/09 18:43

前提

bashでdmenu_runを実質的に拡張した動作のものを実行したいと考えています.但し,エイリアスのみを参照したい場合が考えられるため,拡張の内容は主として外部ファイルへの記述を読み取る形としたいです.dmenuの挙動に関して詳しいことはhttps://wiki.archlinux.jp/index.php/Dmenu を参考としましたが大まかな挙動としては,改行を区切り文字として与えられる文字列を,改行毎に分割して表示,ユーザが選択した後に選択された文字列を標準出力に戻すことになります.ただしユーザは与えられていない文字列を入力することができ,dmenuは標準出力にそれを返します.

実現したいこと

大目標:dmenu_runの機能を拡張し,好きなコマンドラインを実行するエイリアスを追加する.
小目標:エイリアスとして扱う名前と実際に実行するコマンドを対応づけた状態の文字列を連想配列として格納し,そのキーをdmenuが読みとることのできる状態へ加工する.(キーを,改行を区切り文字として連結する.)

発生している問題・エラーメッセージ

~$ ./exMyDmenuRun ./exMyDmenuRun: line 3: [forge]=~/Games/forge/forge.sh&: No such file or directory

bash

#!/bin/bash declare -A ALIASES eval ALIASES={`cat myDmenuRunlib.txt`} Exts="" for k in "${!ALIASES[@]}";do Exts+="$k\n"; done CHOOSE= echo "${Exts}" | dmenu "$@" # | ${SHELL:-"/bin/sh"} & case "$CHOOSE" in "versesaver" ) brave-browser --app=https://versesaver.jp/game& ;; "forge" ) ~/Games/forge/forge.sh& ;; "gimp" ) flatpak run org.gimp.GIMP & ;; "twitch" ) streamlink-twitch-gui & ;; * ) $CHOOSE & ;; esac
$cat myDmenuRun.txt ["versesaver"]="brave-browser --app=https://versesaver.jp/game&"; ["forge"]="~/Games/forge/forge.sh&"; ["gimp"]="flatpak run org.gimp.GIMP&"; ["twitch"]="streamlink-twitch-gui";

試したこと

https://teratail.com/questions/162664 の質問及び回答を参考とし,外部ファイル側で定義していた変数をスクリプト内部でevalを用いることに変更した.以後txtファイルのフォーマットを変更したりしているが大きく調整した箇所は存在しない.

補足情報(FW/ツールのバージョンなど)

$ bash --version
GNU bash, version 5.1.4(1)-release (x86_64-pc-linux-gnu)
$ cat /etc/issue
cat /etc/issue
Debian GNU/Linux 11 \n \l

可能であれば一つの外部ファイルを読み取る形が望ましい(ファイル管理の容易さの為)
外部ファイルの記述フォーマットは余程冗長でなければ任意とする.
スクリプト内に存在するcase文に関しては将来的に連想配列の特性を用いて書き直す予定である.回答は他の場所を優先していただけるとありがたい.
実際に実行する場合,当環境ではdmenuが表示されたが文字列が表示されていなかった.また,xterm等の実行可能なファイルの名前を入力しても実行は行われなかったが,当方では破壊的なコマンドをこれを用いて実行出来てしまった場合に責任が取れないので注意されたし.

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

bash

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