Frage Können einfache Skripts den GUI-Dateimanager verwenden, um eine Datei auszuwählen?


Ich habe ein extrem einfaches Skript, das momentan einen Befehl für eine Datei ausführt, die sich im selben Ordner befindet: command ./file_in_folder option output. Es wäre besser, wenn das Skript den Benutzer fragt, welche Datei er möchte.

Kann ein einfaches Skript den standardmäßigen GUI-Dateimanager des Betriebssystems dazu auffordern, die ausgewählte Datei zurück zum Skript zu leiten?

Gefälschter Code:

  • Ausführbares Benutzer-Doppelklick-Skript
  • GUI-Dateimanager erscheint
  • Benutzer wählt aus <FILE>
  • Skript wird ausgeführt command <FILE> option output

Wenn nein, was ist zu empfehlen? <FILE> zu dem Skript, das ausgeführt wird command <FILE> option output?


2
2018-01-31 01:42


Ursprung


Ich bin mir nicht sicher, ob das, was du willst, möglich ist, also mache ich keine vollständige Antwort. Aber für ein einfaches Skript ist es wahrscheinlich besser, einen textbasierten Dialogersteller wie Zenity zu verwenden. Ein kurzes Beispiel finden Sie unter askubuntu.com/questions/244836/ ... - chaskes
Alternativ können Sie immer die name über STDIN und speichern Sie es als Variable für die spätere Verwendung. - heemayl
Ich zweite @chaskes, zenity ist das Werkzeug dafür. Siehe die GNOME-Dokumentation zur Dateiauswahl: help.gnome.org/users/zenity/stable/file-selection.html.de - muru
@muru Netter Link zu den Dokumenten. Ich habe Zenity eine Zeit lang nicht benutzt und einige der integrierten Funktionen vergessen, wie Dateiauswahl. Du solltest eine Antwort geben. - chaskes
Oder lesen Sie eine Liste von Dateien (von ls vielleicht), zeige die Ergebnisse an und frage nach einer "Pickdateinummer 1 bis n", mit Zenity oder nur dem Terminal? - Xen2050


Antworten:


Zenity kann verwendet werden, um eine GUI-Dateiauswahl zu treffen --file-selection Möglichkeit. Für eine einzelne Datei reicht das aus:

#! /bin/bash

file="$(zenity --title "Pick a file" --file-selection)"
do something with "$file"

enter image description here

Wo es schwierig wird, ist die Handhabung mehrerer Dateien. Es gibt nur zwei Zeichen, die in Dateinamen nicht erlaubt sind: die ASCII NULL und /. /erscheint natürlich in Pfaden. Daher ist das einzige Zeichen, das Sie sicher auswählen können, um zwei Dateinamen zu trennen NUL. Sie können NUL nicht verwenden, da das Zeichen als Befehlszeilenparameter übergeben werden muss.

Sie haben zwei Möglichkeiten:

  • Wählen Sie jeweils eine Datei mit wiederholten Auswahldialogen aus.
  • Überprüfen Sie, dass jeder Pfad von zurückgegeben wird zenity ist ein absoluter Pfad und die Datei existiert.

Etwas wie:

#! /bin/bash

OLDIFS="$IFS"
IFS='-'
FILES=($(zenity --file-selection --multiple --separator='-' --title "Pick a file"))
IFS="$OLDIFS"

for file in "${FILES[@]}"
do
    if [[ $file == /* && -f $file ]]
    then
        echo $file
    fi
done

Natürlich schützt uns das auch nicht vor einem Dateinamen wie /foo/bar-/etc/passwd. Seien Sie also vorsichtig, wenn Ihr Skript mit höheren Rechten als der Benutzer ausgeführt wird.


4
2018-02-06 10:17