Как открыть файл из скрипта bash?

22

Итак, бег gedit myfile.txtработает хорошо. Но как насчет открытия файла внутри скрипта bash с использованием стандартного настольного приложения, связанного с типом файла?

Я попробовал ниже, который прекрасно работает при запуске вручную в терминале, но когда я помещаю его в файл Bash, ничего не происходит:

#!/bin/bash
xdg-open "myfile.txt"&

Что я должен сделать вместо этого?

Обратите внимание, что мне нужно, чтобы файл оставался открытым и после закрытия терминала.

промышленные
источник
1
попробуйте указать путь к файлу .. и вы уверены, что он должен быть в кавычках? Попробуйте без кавычек
abhishek
7
Вы уверены, что команда ничего не делает? Я только что создал сценарий с содержимым, которое вы перечислили, и он открывается geditс перечисленным файлом (или открывает новую вкладку в существующем сеансе). Однако он возвращается немедленно, а не блокируется до выхода из программы.
Джеймс Хенстридж
3
Кроме того, какие ошибки вы получаете при запуске скрипта из терминала?
Таккат
Ага. Я использую полный путь к файлу в моем скрипте, но удалил его здесь, чтобы уточнить. Нет разницы с или без кавычек. Я пробовал xtg-openна *.txt, *.htmlи больше - просто не будет работать.
Промышленный
5
@abhishek: не бывает случаев, когда кавычки вредны в таких ситуациях, и множество случаев, когда опущение кавычек может вызвать проблемы. Хорошей практикой является всегда приводить в кавычки все строки, даже если они не нужны, если только у вас нет особых причин не делать этого.
Скотт Северанс

Ответы:

16

Я думаю, что ваш сценарий должен работать. Но вы можете добавить что-то к нему, чтобы получить немного больше информации:

#!/bin/bash
T=`xdg-mime query filetype $1`
echo "opening file "  $1  " of type " $T "with " `xdg-mime query default $T`
xdg-open $1
echo "finished script"

при запуске этого скрипта (с именем my_open.sh) в терминале, например:

my_open.sh path/to/somefile.txt

Я получаю следующий вывод:

opening file  path/to/somefile.txt  of type  text/plain with  gedit.desktop
finished script

это говорит мне, что путь к файлу в порядке, mimetype распознается, и рабочий стол, который используется для открытия файла, также в порядке. И Gedit открывается с файлом, о котором идет речь.

Теперь при запуске на другом файле:

my_open.sh path/to/README

Я получаю следующий вывод:

opening file  path/to/README  of type  text/x-readme with
finished script

Обратите внимание на другой mimetype и отсутствующий файл рабочего стола. Тем не менее, xdg-open открывает настройки по умолчанию для всех текстовых файлов (gedit).

Итак, вы можете захотеть добавить что-то подобное в ваш скрипт и посмотреть, получите ли вы неожиданный вывод (который вы затем можете добавить к своему вопросу ...).

xubuntix
источник
хорошо, за исключением шумных finished scriptв конце. Я рекомендую [ catb.org/~esr/writings/taoup/html/]( Искусство программирования Unix) правило молчания. Кстати: обратные пометки устарели - вместо этого предпочитайте $ (...), что является вложенным.
пользователь неизвестен
2
ну, сценарий предназначен для предоставления дополнительной информации. Информация, предоставленная «готовым скриптом», вам не нужна nohupили &, но она xdg-openвозвращается и позволяет вам продолжить.
xubuntix
Вот для чего предназначен запрос.
неизвестный пользователь
3
правда. Просто подумал, что так будет более очевидно. на самом деле весь сценарий не нужен, потому что он делает не больше, чем xdg-openуже делает, так что в любом случае это не сценарий качества производства ...
xubuntix
5

Сделайте bash-скрипт test.sh как:

#!/bin/bash
gedit myfile.txt

Затем сделайте скрипт исполняемым как:

chmod +x test.sh

Наконец, запустите скрипт как:

./test.sh
эскимо
источник
Спасибо за ваш ответ, но, к сожалению, мне нужно открыть редактор файлов GNOME по умолчанию для файла, как указано выше.
Промышленный
3

Может быть, gnome-open вместо xdg-open

Денис
источник
Я нашел, что это решение работало лучше всего
Джон
Что если пользователь не в Gnome?
Годдард
2

Вы идете в правильном направлении. Если вы хотите, чтобы приложение GUI оставалось открытым, когда вы закрываете окно терминала, вам просто нужно добавить nohupв начале строки.

#!/bin/bash
nohup xdg-open "myfile.txt"&

Если приложение с графическим интерфейсом не открывается, возможно, из-за того, что DISPLAYв оболочке не установлена переменная окружения, из которой вы пытаетесь его запустить. Попробуйте сделать эхо$DISPLAY

отметка
источник
3
xdg-open не требует nohupни&
xubuntix
0

Первая часть вашего вопроса

с помощью команды catвы можете открыть файл внутри терминала, если это то, что вы хотите (об этом говорится в первой части вашего вопроса).

чтобы использовать его, вы можете просто напечатать cat FILENAME.

Дополнительная информация

Если вам нужно больше команд: вот хороший список команд.

GNOME редактор по умолчанию

Если вы хотите открыть файл в приложении по умолчанию GNOME gedit.

чтобы использовать это, просто наберите gedit FILENAME

Альвар
источник
Это открывает файл в терминале, но не редактор по умолчанию GNOME
Industrial
@industrial отредактировал мой ответ.
Алвар
К сожалению, open также не будет работать ...
Industrial
@ Промышленный Что ты просишь? объясни свой вопрос дальше! Вы говорите несколько разных вещей, и я ответил на один из них, но вы говорите, что не хотите его использовать ...
Алвар
@ Промышленный текстовый редактор по умолчанию в GNOME - это gedit aka «текстовый редактор», так что если вы запустите его, gedit file.filetypeвы откроете файл так, как хотите!
Алвар
0

Хотя я не уверен, что на самом деле должно быть достигнуто здесь, и основываясь на некоторых недавних комментариях, один скрипт должен открывать ЛЮБОЙ файл в приложении по умолчанию или в той степени, в которой это приложение поддерживает.

Если это так, то самый простой способ сделать это - открыть терминал и перейти к имени сценария / пути / к / имени файла или, если в пути есть пробелы, тогда имя сценария '/ пути / к / имени файла'

cd; mkdir -p bin && gedit ~/bin/openit1

Используйте это как скрипт, вы можете использовать любое имя для скрипта, я буду использовать openit1 в качестве примера. Лучше всего использовать сценарии непосредственно из ~ / bin для добавления числа к имени, чтобы не конфликтовать ни с какими существующими командами Linux

#!/bin/bash
xdg-open "$1"

Закройте Gedit & в терминале

chmod u+x ~/bin/openit1

Перезапустите, чтобы добавить ~ / bin в ваш $ PATH

Для вызова откройте терминал и зайдите

openit1 /path/to/filename or openit1 'path/to/filename' 

Если указано как оригинал и используется ориг. сценарий для одного конкретного файла для каждого сценария и вызова d. щелкнув левой кнопкой мыши на скрипте, вам просто нужно выбрать « Выполнить » вместо «Выполнить в терминале»

Дуг
источник
Restart to add ~/bin to your $PATH- Хм, старые привычки Windows? ;)
неизвестный пользователь