Поэтому для курса по операционным системам я решил интегрировать пользовательскую программу, похожую на FTP, в контекстное меню (написанное на языке C), и у меня возникли проблемы с тем, чтобы созданные мной скрипты отображались и работали так, как мне нужно.
Цель состоит в том, чтобы сделать его максимально интегрированным в ОС. Я нашел тему о том, как добавить действие в обычное контекстное меню, но у меня возникли проблемы с тем, чтобы заставить мои скрипты Nautilus работать правильно.
Проблема возникает в том, что даже при наличии скрипта в папках скриптов nautilus, запуск его в действии nautilus не заполняет переменные file-select ( NAUTILUS_SCRIPT_SELECTED_FILE_PATHS
), которые нужны скрипту для запуска моей программы. Однако запуск их через меню скриптов заполняет. Я хотел бы знать, возможно ли, чтобы это работало?
Это появляется, когда не выбрано ни одного файла, так как это запустит мою программу для получения файлов. Мне нужно, чтобы это было возможно, чтобы получить папку, по которой я щелкнул правой кнопкой мыши, если это возможно:
Это появляется, когда выбраны некоторые файлы. Мне нужно получить список выбранных файлов, чтобы моя программа знала, какие файлы отправлять:
В настоящее время мне приходится использовать меню скриптов. Это нежелательно, поскольку меню скриптов появляется только при выборе элемента:
Возможно ли то, что я хочу сделать?
Дополнительная информация: Программа для их отправки/получения — это написанный мной сокет-сервер. Я понимаю, что, вероятно, это можно было бы сделать гораздо проще с помощью простого Bash FTP, но я не думаю, что мой профессор был бы впечатлен решением из 4 строк в курсовом проекте.
Я пишу скрипты на bash.
Вот пример кода bash:
#!/bin/bash
echo Hello World!
IP=$(zenity --entry --text "What is the IP you want?" --entry-text "")
PORT=$(zenity --entry --text "What is the PORT you want?" --entry-text "3000")
for file in $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS
do
zenity --info --text $file
/home/admin/fileSending/clientRecieve $IP $PORT "$file"
done
echo $IP
решение1
Я понял ответ, короче говоря, вам нужно использовать параметры, чтобы задать ваши переменные. Параметр %b
передает имя файла как аргумент командной строки, к которому можно получить доступ через "$1"
для первого аргумента. в случае он %B
даст вам все файлы как отдельные аргументы, поэтому вам понадобится "$1"
"$2"
и т. д...
Вы также можете использовать $PWD
для получения текущего рабочего каталога. ОДНАКО, есть несколько важных вещей, которые следует отметить по этому поводу, так как текущий рабочий каталог не всегда то, что вы могли бы подумать. Когда вы выбрали файл в папке, скажем, /home/admin/myStuff/test.txt
рабочий каталог скрипта будет /home/admin/myStuff
. Поэтому вы можете использовать "$PWD/$1"
для получения текущего рабочего каталога + /
+ выбранный файл. Код выглядит следующим образом
#!/bin/bash
#Author: Thomas Migus, created on March 20th 2018
#this is a script that runs the client that will send the file.
FILE="$PWD/$1"
IP=$(zenity --entry --text "What is the IP you want?" --entry-text "127.0.0.1")
PORT=$(zenity --entry --text "What is the IP you want?" --entry-text "3000")
/home/admin/fileSending/clientSend $IP $PORT $FILE
zenity --info --text "File sent"
Если вы не выбрали папку, рабочий директор меняется. Допустим, вы нажимаете правой кнопкой мыши на пустом месте внутри /home/admin/myStuff
рабочего каталога, и это /home/admin
НЕ будет/home/admin/myStuff
Чтобы выбрать рабочий каталог, вы можете использовать , %b
чтобы узнать, в каком каталоге вы фактически находитесь. Код выглядит следующим образом:
#!/bin/bash
#Author: Thomas Migus, created on March 20th 2018
# This is a script which runs the server
OUTPUT="$PWD/$1/"
PORT=$(zenity --entry --text "What is the port number?" --entry-text "3000")
/home/admin/fileSending/serverRecieve $PORT $OUTPUT
zenity --info --text "File recieved"
Вы можете проверить это самостоятельно с помощью этого небольшого скрипта
#!/bin/bash
zenity --info --text "$1"
zenity --info --text "$PWD"