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

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

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

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

Q&A

解決済

1回答

389閲覧

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

Sme

総合スコア30

bash

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

0グッド

0クリップ

投稿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

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等の実行可能なファイルの名前を入力しても実行は行われなかったが,当方では破壊的なコマンドをこれを用いて実行出来てしまった場合に責任が取れないので注意されたし.

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

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

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

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

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

guest

回答1

0

自己解決

bash

1#!/bin/bash 2typeset -A ARR 3while IFS=$':= \t' read key value; do 4 [[ $key = [#!]* ]] || [[ $key = "" ]] || ARR[$key]=$value 5done < myDmenuRunlib.ini 6Exts="" 7for k in "${!ARR[@]}";do 8 Exts+="$k\n"; 9done 10Exts+=`dmenu_path` 11CHOOSE=`echo -e "${Exts}" | dmenu "$@"` 12if [ -n "${ARR["$CHOOSE"]}" ]; then 13 ${ARR["$CHOOSE"]} & 14else 15 $CHOOSE & 16fi

myDmenuRunlib.ini

ini

1versesaver=brave-browser --app=https://versesaver.jp/game 2forge=~/Games/forge/forge.sh 3gimp=flatpak run org.gimp.GIMP 4twitch=streamlink-twitch-gui

https://www.web-dev-qa-db-ja.com/ja/bash/%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E9%80%A3%E6%83%B3%E9%85%8D%E5%88%97%E3%81%AB%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%82%80%E6%96%B9%E6%B3%95%E3%81%AF%EF%BC%9F/962507048/

https://qiita.com/YutaSaito1991/items/c7c6bacb916f41ef1471
を主に参考とさせて頂きました.

投稿2022/08/11 03:28

Sme

総合スコア30

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問