Это потому, что вы выводите все числа на экран через 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
.
Когда файл открывается приложением, файл просто передается приложению в качестве аргумента.
Таким образом, когда вы открываете 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» или с чем угодно. Откройте файловый менеджер, нажмите вторую кнопку мыши на файле и выберите «Открыть с помощью» или аналогичный вариант. Поскольку это связано с графическим интерфейсом, я добавлю несколько примеров изображений.
Nautilus, «Открыть с помощью другого приложения»:
Наутилус, «Просмотреть все приложения»:
«КопияКэт»:
По завершении вы увидите tempfile-#{n}
, созданный в/tmp/
Файловый менеджер, который я здесь использовал, называется Nautilus.но это должно работать и с другими файловыми менеджерами, просто текст может отличаться.
Второй вариант — , чтобы сделать приложение доступным для всех пользователей. Для этого вам нужно переместить файл из $HOME/.local/share/applications/copycat.desktop
в /usr/share/applications
и сменить владельца на root.
Вот как работает в Linux открытие с помощью пользовательского исполняемого файла. Аналогичное приложение с графическим интерфейсом можно создать и открыть таким же образом.
case $1 in
*txt) applic=less ;;
*html) applic=vim ;;
esac
xterm -e $applic $1 &
Минималистичный, но проверенный.
Этот скрипт можно вызвать из первого xterm. Не смотрите на case-esac
, а обратите внимание на xterm
с -e
и амперсандом.