Как работает пользовательский исполняемый файл «Открыть с помощью» в Linux?

Это потому, что вы выводите все числа на экран через put . Затем они должны быть отправлены по SSH-соединению, что увеличивает время выполнения скриптов. Вывод также буферизуется локально, но эффекты не так заметны.

Вы можете подтвердить это, вместо этого выгрузив весь вывод в файл.

Примеры

локально на ноутбуке на экран

$ time ruby r.rb

real    0m19.474s
user    0m3.236s
sys     0m3.207s

локально на портативном компьютере в файл

$ time ruby r.rb >& rb_local.txt

real    0m0.785s
user    0m0.760s
sys     0m0.020s

SSH на рабочий стол на экран

$ time ruby r.rb
real    0m18.026s
user    0m4.118s
sys     0m3.815s

SSH на рабочий стол в файл

$ time ruby r.rb >& rb_remote.txt

real    0m3.942s
user    0m3.036s
sys     0m0.741s

Обычно это хорошая идея при написании таких сценариев вместо этого выгрузить содержимое в файл, а затем использовать такой инструмент, как tail , для периодического просмотра файла.

ПРИМЕЧАНИЕ: Нотация > & перенаправит как STDERR, так и STDOUT в файлы .txt . Однако вывод из времени по-прежнему будет отображаться на консоли. Это обозначение эквивалентно cmd> some_file.txt 2> & 1 .

2
08.03.2019, 18:14
2 ответа

Введение

Когда файл открывается приложением, файл просто передается приложению в качестве аргумента.

Таким образом, когда вы открываете firefox -nightly , расположенный в /bin/с p.html, расположенным в /home/user/, это в основном похоже на запуск /bin/firefox-nightly /home/user/p.html.

Создание исполняемого файла

Как упоминалось в вопросе:

So far I have made a small GUI program with Ruby and made it executable and tried to open foo.txt with my program (I used the Nemo file manager).

Давайте создадим программу на Ruby по запросу OP, которая будет копировать содержимое файла, переданного в качестве аргумента, в /tmp/tempfile-#{n}. Обратите внимание, что любой язык программирования будет работать, если он может принимать аргументы командной строки.

#!/usr/bin/env ruby

# Errors
ERR_NO_FILE = 2

FILE = $*[0]

begin
    tempfile, counter = File.join(%W(/ tmp tempfile)), 0
    tempfile.replace(File.join(%W(/ tmp tempfile-#{counter += 1}))) while File.exist?(tempfile)
    IO.write(tempfile, IO.read(FILE))
rescue Errno::ENOENT
    exit!(ERR_NO_FILE)
rescue Interrupt, SystemExit, SignalException
    exit!(0)
rescue Exception
    abort($!.backtrace.join(?\n))
end if FILE

И давайте назовем нашу программу copycat.rb и переместим ее в каталог /tmp/.

Мы наверняка сможем запустить программу на таком терминале:

/tmp/copycat.rb /tmp/AFile

Это скопирует все содержимое /tmp/AFileв /tmp/tempfile-#{n}. Где #{n}— это счетчик на случай существования дублирующегося временного файла.

Создание записи приложения

Теперь, чтобы открыть это с помощью нашей программы из файлового менеджера, нам нужно создать запись приложения. Для этого у нас есть 2 варианта. первый вариант:

Создайте файл с именем copycat.desktop в $HOME/.local/share/applicationsсо следующим содержимым:

[Desktop Entry]
Version=1.0
Type=Application
Name=CopyCat
Comment=Copy the contents of a file to /tmp/tempfile#{n}
Exec=/tmp/copycat.rb %u
Icon=edit-copy
Path=
Terminal=false
StartupNotify=false
Actions=
Categories=Copy;Utility

Не забудьте добавить опцию %uк строке, начинающейся с Exec.

Тестирование

Что ж, для проверки давайте создадим простой файл с именем «hello world» или с чем угодно. Откройте файловый менеджер, нажмите вторую кнопку мыши на файле и выберите «Открыть с помощью» или аналогичный вариант. Поскольку это связано с графическим интерфейсом, я добавлю несколько примеров изображений.

  1. Nautilus, «Открыть с помощью другого приложения»:

    Nautilus, "Open With Other Application"

  2. Наутилус, «Просмотреть все приложения»:

    Nautilus, "View All Applications"

  3. «КопияКэт»:

    "CopyCat"

  4. По завершении вы увидите tempfile-#{n}, созданный в/tmp/

    enter image description here

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

Второй вариант , чтобы сделать приложение доступным для всех пользователей. Для этого вам нужно переместить файл из $HOME/.local/share/applications/copycat.desktopв /usr/share/applicationsи сменить владельца на root.

Вот как работает в Linux открытие с помощью пользовательского исполняемого файла. Аналогичное приложение с графическим интерфейсом можно создать и открыть таким же образом.

4
27.01.2020, 22:02
case $1 in
 *txt)  applic=less ;;
 *html) applic=vim  ;;
esac

xterm -e $applic $1 &

Минималистичный, но проверенный.

Этот скрипт можно вызвать из первого xterm. Не смотрите на case-esac, а обратите внимание на xtermс -eи амперсандом.

1
27.01.2020, 22:02

Теги

Похожие вопросы