5

基本的に私は言いたいです:

  echo `grep ^foo /usr/share/dict/words | popup_menu`

...そして、vimの「:Explore」メカニズムがどのように機能するかと非常によく似た、ある種のキーボードでナビゲート可能なメニューポップアップまたは選択ツールがあります。

「標準ツールでどこでも簡単に動作する」ための極端なボーナスポイント

また、「何らかの追加の構成ファイルまたは5〜10行のシェルスクリプトが必要」も許容されます。

その時点で「このperlライブラリまたは100行のPythonスクリプトなどをダウンロードしてください...」というのはあまり受け入れられません。インストールする実際のプログラム/パッケージを見つけて、ハード依存関係としてリストすることをお勧めします。しかし、ライブラリを追跡する必要のない2〜5行のperl / pythonスクリプトを思い付くことができれば、おそらくそれも機能するでしょう。

私は調査しました:

  • ダイアログ-アドホックスクリプトではなく「シェルアプリケーション」を対象としているように見えます(ただし、私が望むことを実行させる方法があるようです)。欠点は、現在の画面状態が上書きされることです。

  • Curses-「C」をターゲットにしているようです。または、perl / pythonライブラリの一部として使用する必要があり、これを使用して独自のメニュープログラムを作成する必要があります。

  • bash "select"ビルトイン-キーボードナビゲーションではなく、番号選択を介して機能します。使用するのは少し厄介ですが、かなり近いです

  • Vim-"grep ^ foo / usr / share / dict / words | vim-" ...これにより、驚くほど近くになります。「Enterキーをバインドして、現在の行をターミナルに出力して終了する」がありません。

...では、bashスクリプトで使用するための、まともでシンプルなアドホックメニューメーカーを作成または検索するにはどうすればよいですか?コマンドラインで怠惰になっているときはどうすればよいですか?

 ... git checkout -b `git branch -a | menu`
 ... ssh `grep foo /etc/hosts | menu`
 ... rm `ls | menu`  # ignore obvious quoting issues with this...

編集:これまでの回答に感謝しますが、ASCII /テキストメニュー(xwindowsではない)を探していることを再度強調したいと思います。私は地元でいくつかのことを試していますが、まだスイートスポットに到達しているものはありません。

4

4 に答える 4

1

zenityはスクリプトでの使用が非常に簡単ですが、GUIウィンドウを作成します。それがあなたに当てはまるかどうかわからない...

于 2010-08-31T14:07:52.270 に答える
1

お使いのバージョンにダイアログがあり、端末が代替画面をサポートしている場合は、この--keep-titeオプションを使用してダイアログを表示できます。たとえば、一部のxterm互換端末はそうします。xterm

このオプションを使用すると、出力が代替画面に切り替わり、ダイアログが表示されます。ダイアログを閉じると、画面が元に戻り、前の内容が表示されます。vimたとえば、これが機能する方法です。

ただし、ダイアログは引き続き完全に画面を占有します。

「keep-tite」の「ti」と「te」は、カーソルの動きを使用するプログラムを囲むために使用されるタームキャップコードを表します。対応するterminfoコードはとsmcupですrmcupman 5 termcapman 5 terminfoおよびman xterm(その他の機能)を参照してください。

次のように自分で行うこともできます。

tput smcup
# bash select menu
tput rmcup
于 2010-08-31T23:16:31.717 に答える
1

徹底的な調査の結果、ポップアップメニューを作成するための最良の(?)方法の勝者は次のとおりです。

    select f in aaa bbb ccc ddd ; do echo $f ; break ; done

それ自体はポップアップメニューではありませんが、標準のUNIXを使用する限り、最高の価値を得ることができ、ほぼ世界中で利用できます。シンプルなシェルスクリプトでラップすることは、どこにいても簡単に実行でき、その利点をワークフローに確実に統合できることを意味します。

    $ cat ~/bin/menu.sh
    #!/bin/sh
    ALL=`cat`
    select FOO in $ALL ; do echo $FOO ; break ; done

    $ ls /usr | ~/bin/menu.sh
    1) bin      3) include    5) lib64    7) sbin    9) src
    2) games    4) lib        6) local    8) share
    #? 2
    games

ただし、実際には、ダイアログコマンドが使用できない場合のフォールバックとして、「select fin...」イディオムを使用する必要があります。次のシェル/ダイアログスクリプトはちょっと醜いですが、上記と同じ入力と出力を提供する限り、より快適なユーザーインターフェイスで作業を完了します。

    $ cat ~/bin/gui-menu.sh
    #!/bin/sh

    # get stdin
    ALL=`cat`

    # number the lines
    SPLITTED=$( echo $ALL | sed 's/ /\n/g' | awk -- '{print NR, $0 }' )

    # prompt via dialog (output-fd=1 is so that dialog gui doesn't go to subshell)
    OUT=$( dialog --output-fd 1 --ok-label Select --menu Choose 0 50 22 $SPLITTED )
    EXIT_CODE=$?

    # handle escape / cancel buttons
    if [ "1" = "$EXIT_CODE" ] ; then exit 1 ; fi
    if [ "255" = "$EXIT_CODE" ] ; then exit 1 ; fi

    # extract text corresponding to user's numeric selection
    CHOSEN=$( echo $ALL | sed 's/ /\n/g' | awk -- "NR==$OUT {print \$0 }" )

    # print result
    echo $CHOSEN

...上記の「menu.sh」とまったく同じように使用されますが、数値ではなくGUIを表示します。上記を拡張してダイアログの複数のチェックボックスを許可するのは比較的簡単です(非常に非効率的で、以下の実装ではおそらくn ^ 2-ish)。これを次に示します。

    $ cat ~/bin/gui-multiselect.sh
    #!/bin/sh

    # get stdin
    ALL=`cat`

    # number the lines
    SPLITTED=$( echo $ALL | sed 's/ /\n/g' | awk -- '{print NR, $0, 0 }' )

    # prompt via dialog (output-fd=1 is so that dialog gui doesn't go to subshell)
    OUT=$(dialog --output-fd 1 --ok-label Select --separate-output --checklist Choose 0 50 22 $SPLITTED)
    EXIT_CODE=$?

    # handle escape / cancel buttons
    if [ "1" = "$EXIT_CODE" ] ; then exit 1 ; fi
    if [ "255" = "$EXIT_CODE" ] ; then exit 1 ; fi

    # loop through selected numbers
    for X in $OUT ; do
        # inefficiently print out the text corresponding to the selections
        CHOSEN=$( echo $ALL | sed 's/ /\n/g' | awk -- "NR==$X {print \$0 }" )
        echo $CHOSEN
    done;

そして3番目は、Joey Hessの「vipe」インタラクティブパイプラインエディター(「moreutils」パッケージから)です。これにより、パイプラインを編集して、その出力を元に戻すことができます。

 echo `ls | vipe`

上記のコマンドはダイアログボックスではありませんが(上/下矢印を使用してEnterキーを押すだけではなく、実際には不要な行をすべて削除する必要があります)、インタラクティブなシングルとマルチの両方を処理できるので便利です。ユースケースを選択し、あらゆる面で興味深いツールです。

GUIの選択では、Jackが参照するzenityは、ダイアログと比較して使いやすさの点で勝者のように見えます...ダイアログは残念ながら「アドホック」ではありませんが、ダイアログと「selectfin...」を組み合わせるとうまくいきません。フォールバックは私のニーズに最も合うものです。

于 2010-09-01T16:50:42.690 に答える
0

スクリプトがLinuxの特定のディストリビューションで実行されることがわかっている場合は、通知ポップアップを実行するためにすでに開発されているプログラムを使用できます。私はここで同じことを探していました: Linuxコマンドラインポップアップ

于 2010-09-01T16:59:50.863 に答える