LoginSignup
1
0

More than 1 year has passed since last update.

【Ubuntu】PWAでインストールしたアプリをコマンドラインで呼び出せるようにする【PWA】

Last updated at Posted at 2022-07-02

発端

Google driveとかコマンド一発で呼び出せると良くね?

調べてみた!

PWAとしてインストールするとデスクトップにアイコンが作られるけど……

結論から言うとUbuntuでは ~/.local/share/applications/*.desktop に色々あります
本筋から外れますが、ここにdesktopファイルを作っておくとお気に入りとしてDockに登録可能になります

よし、desktopファイルがあるのはわかった!

PWAでインストールしたアプリのdesktopファイルは基本的に以下のようになっているようです

所定の場所 ( .local/share/appllications ) に chrome-[APP-ID]-[PROFILE].desktop という名前で作られているようです

~/.local/share/applications/chrome-abnfpfhjmipcnaibcolbacfhgfcmjjbn-Default.desktop
#!/usr/bin/env xdg-open
[Desktop Entry]
Version=1.0
Terminal=false
Type=Application
Name=Microsoft OneDrive
Exec=/opt/google/chrome/google-chrome --profile-directory=Default --app-id=abnfpfhjmipcnaibcolbacfhgfcmjjbn
Icon=chrome-abnfpfhjmipcnaibcolbacfhgfcmjjbn-Default
StartupWMClass=crx_abnfpfhjmipcnaibcolbacfhgfcmjjbn

Name は manifest.json の name 項目の値となっていそうです
Exec が実際のブラウザの呼び出しとなります

つまりここを抽出してシェルスクリプトにするなりすればコマンド呼び出しで実行することが可能になりそうです

app-id が振られてブラウザが管理してるんでしょうね
この辺は余力があれば調べてみたいです

コマンド化するためのスクリプトを作るよ!

作ったシェルスクリプト

~/bin/pwa2cmd
#!/usr/bin/bash

CHROME=~/bin/google-chrome

NUM=1

IFS=$'\n'
for LINE in $(grep -lr "app-id" ~/.local/share/applications/ | xargs grep Name); do
  NAME[$NUM]=$(echo $LINE | sed -e 's/.*\.desktop:Name=//')
  FILE[$NUM]="$(echo $LINE | sed -e 's/\(.*.desktop\):.*/\1/')"
  echo $NUM ${NAME[$NUM]}
  NUM=$(( $NUM + 1 ))
done

echo
echo -n "アプリを選択してください> "
read INPUT_NUM

if [ -z "${FILE[$INPUT_NUM]}" ]; then
  echo "有効なアプリが見つかりません"
  exit 1
fi

echo "${NAME[$INPUT_NUM]}"

echo
echo -n "保存するコマンド名を入力してください> ~/bin/"
read INPUT_CMD

if [ -z "${INPUT_CMD}" ]; then
  echo "コマンド名が入力されていません"
  exit 2
fi

INPUT_CMD=~/bin/"${INPUT_CMD}"

if [ -e "${INPUT_CMD}" ]; then
  echo "既に存在するコマンドです"
  exit 3
fi

COMMAND_LINE=$(grep -m1 Exec "${FILE[$INPUT_NUM]}" | sed -e 's/^Exec=//')

if [ ! -z "$CHROME" ]; then
  COMMAND_LINE=$(echo -n "${CHROME} "; echo "${COMMAND_LINE}" | cut -d ' ' -f 2-)
fi

echo "#!/usr/bin/bash

$COMMAND_LINE > /dev/null 2>&1 &" > "${INPUT_CMD}"
chmod 755 "${INPUT_CMD}"

echo ${INPUT_CMD} を作成しました

使い方

pwa2cmd を実行するとPWAでインストールされているアプリ一覧が表示されます
番号が振られているので、コマンドに落としたい番号を入力します
次に ~/bin 以下に保存するコマンド名を入力して完了です

これで ~/bin にパスが通っていれば任意の場所から上記で入力したコマンド名を打つことでPWAのアプリを立ち上げることが可能になりました

スクリプトの解説

CHROME=~/bin/google-chrome

ここは僕の環境ではchromeの呼び出しをラッパーのスクリプト経由で行っているためなので、特別な理由がなければ空で問題ないです

NUM=1

変数の初期化

IFS=$'\n'
for LINE in $(grep -lr "app-id" ~/.local/share/applications/ | xargs grep Name); do
  NAME[$NUM]=$(echo $LINE | sed -e 's/.*\.desktop:Name=//')
  FILE[$NUM]="$(echo $LINE | sed -e 's/\(.*.desktop\):.*/\1/')"
  echo $NUM ${NAME[$NUM]}
  NUM=$(( $NUM + 1 ))
done

最初パイプでwhileに食わせたらサブシェル立ち上がるのでwhile内でセットした変数取り出せない罠にはまりました
IFS=$'\n' で区切り文字を改行文字としてforで1行ずつ処理するようにしてあります
これがないとスペースが区切り文字として扱われるので1行ずつの処理が出来ません

grep -lr "app-id" ~/.local/share/applications/~/.local/share/applications/ 以下にある app-id を含むファイル名を列挙します
これを xargs に渡し、そこで各ファイルの Name 項目の行を抽出します

ループの中を見ていきましょう

  NAME[$NUM]=$(echo $LINE | sed -e 's/.*\.desktop:Name=//')

ここは後で数値を入力した際にNameを表示するために配列にNameの値を格納しています

FILE[$NUM]="$(echo $LINE | sed -e 's/\(.*.desktop\):.*/\1/')"

ここはファイルパスを保存していきます
あとでこのパスからExecの項目を抽出することになります

echo $NUM ${NAME[$NUM]}

コンソールに番号と対応するNameの値を表示します

  NUM=$(( $NUM + 1 ))

インクリメントします

echo
echo -n "アプリを選択してください> "
read INPUT_NUM

if [ -z "${FILE[$INPUT_NUM]}" ]; then
  echo "有効なアプリが見つかりません"
  exit 1
fi

echo "${NAME[$INPUT_NUM]}"

read INPUT_NUM で標準入力から読み取った値をINPUT_NUMに保存します
FILE配列からINPUT_NUMに該当する項目が存在しない場合はエラーメッセージを表示して終了します
項目があれば入力が間違っていないか確認のために選択したNameの値を表示します

echo
echo -n "保存するコマンド名を入力してください> ~/bin/"
read INPUT_CMD

if [ -z "${INPUT_CMD}" ]; then
  echo "コマンド名が入力されていません"
  exit 2
fi

INPUT_CMD=~/bin/"${INPUT_CMD}"

if [ -e "${INPUT_CMD}" ]; then
  echo "既に存在するコマンドです"
  exit 3
fi

read INPUT_CMD で標準入力から保存するコマンド名をINPUT_CMDに保存します
コマンドが入力されない場合はエラーメッセージを表示して終了します
すでに存在するコマンド名の場合はエラーメッセージを表示して終了します

雑に保存先は ~/bin 以下に固定しています

COMMAND_LINE=$(grep -m1 Exec "${FILE[$INPUT_NUM]}" | sed -e 's/^Exec=//')

if [ ! -z "$CHROME" ]; then
  COMMAND_LINE=$(echo -n "${CHROME} "; echo "${COMMAND_LINE}" | cut -d ' ' -f 2-)
fi

Execの値からコマンドラインを抽出します
冒頭のCHROME変数がセットされている場合はchromeコマンドの差し替えをします

なお、YouTubeのPWAなどは複数のExecがありますが、最初の物だけ拾うようにしています

echo "#!/usr/bin/bash

$COMMAND_LINE > /dev/null 2>&1 &" > "${INPUT_CMD}"
chmod 755 "${INPUT_CMD}"

echo ${INPUT_CMD} を作成しました

シェルスクリトとしてCOMMAND_LINEを実行する形でファイルを生成します
実行権限を付与します

以上

そもそも

Google driveはPWA化してたか?

次回に続く……!


それでは良いLinuxライフを。

1
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
1
0