前提
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
1#!/bin/bash 2declare -A ALIASES 3eval ALIASES={`cat myDmenuRunlib.txt`} 4Exts="" 5for k in "${!ALIASES[@]}";do 6 Exts+="$k\n"; 7done 8CHOOSE= echo "${Exts}" | dmenu "$@" 9# | ${SHELL:-"/bin/sh"} & 10case "$CHOOSE" in 11 "versesaver" ) brave-browser --app=https://versesaver.jp/game& ;; 12 "forge" ) ~/Games/forge/forge.sh& ;; 13 "gimp" ) flatpak run org.gimp.GIMP & ;; 14 "twitch" ) streamlink-twitch-gui & ;; 15 * ) $CHOOSE & ;; 16esac
$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等の実行可能なファイルの名前を入力しても実行は行われなかったが,当方では破壊的なコマンドをこれを用いて実行出来てしまった場合に責任が取れないので注意されたし.
回答1件
あなたの回答
tips
プレビュー