web-dev-qa-db-ja.com

GUIから実行すると、シェルスクリプトが一部のコマンドを実行しない

次のスクリプトがあります。

#!/bin/sh --
oathtool -b --totp XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | xclip -sel clip
echo "OTP Copied!"
sleep 2

ターミナルに移動して./VIPsh ./VIPのように入力すると、oathtoolが実行されます。ただし、shファイルをダブルクリックして[ターミナルで実行]を選択すると、echoおよびsleepコマンドのみが実行され、oathtoolは何も実行しません。

2
lueenavarro

Nautilusの環境設定Executable Text FileのオプションAsk every timeをオンにすると、2つのオプションRun in Terminalが表示されます。 Run、マウスで実行可能ファイルを(ダブル)クリックすると:

enter image description here

あなたが望むものを達成するためにRunを選択する必要があります。これは、Nautilus設定で[実行時に実行可能テキストファイルを開く]を設定した場合のデフォルトの動作でもあります

これらの2つのオプションRun in TerminalRunの動作は異なりますが、残念ながら追加のドキュメントは見つかりませんでした。おそらく最初のものは、端末が閉じられたときに消滅する一時的な環境を作成します。スクリプトの下部にexec shを追加することで、それを証明できます。

#!/bin/sh --
oathtool -b --totp XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | xclip -sel clip
echo "OTP Copied!"
sleep 2
exec sh

コマンドexec shは、(スクリプトの)現在のシェルを新しいshシェルに置き換えるため、ターミナルウィンドウは開いたままになり、ターミナルウィンドウを閉じるまでクリップボードがアクティブになります。もう1つのオプションは、sleep時間を延長することです。これにより、ターミナルウィンドウがスリープしている間、クリップボードがアクティブになります。

Runオプションまたは カスタムショートカット を使用している場合は、次のようにスクリプトを変更することをお勧めします。

#!/bin/sh --
oathtool -b --totp XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | xclip -sel clip \
&& notify-send "OTP Copied!"

したがって、notify-sendは、前のコマンドが&&の意味であるtrueを返した場合にのみGUI環境内で通知を送信します。


上記の説明をUbuntu 16.04と19.04でテストしましたが、違いはありません。同じ動作と提案されたソリューションが両方のOSで機能しています。

2
pa4080