Код в сценарии оболочки выполняется перед другими операциями

#bash #xclip

#bash #xclip

Вопрос:

Эта же проблема лучше сформулирована в вопросе, опубликованном в сообществе Unix amp; Linux StackExchange.

Я программирую скрипт, который открывается при нажатии клавиши, открываю новый терминал (gnome-terminal), запускаю scrot (инструмент для создания скриншотов), сохраняю изображение со случайным именем в каталог, загружаю его в pomf.cat и копирует ссылку в буфер обмена.

Это работает нормально. Что я пытаюсь сделать сейчас, когда загрузка завершена, закройте терминал.

Мой скрипт работает следующим образом:

Ярлык (PrtScr) -> gnome-terminal -e «python path/to/script.py » -> Запустить Scrot -> Сохранить файл (и запомнить путь к файлу) -> bash script2.sh путь / к / изображению -> Загрузить в pomf.cat -> Получить ссылку -> Поместить в буфер обмена через «xclip -буфер обмена выбора»

Поскольку я хочу закрыть терминал после помещения строки в буфер обмена, я добавил это:

 eval $(printf $link | xclip -selection clipboard amp;amp; sleep 1 amp;amp; pkill terminal)
 

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

Однако без «amp;amp; sleep 1 amp;amp; pkill terminal» ссылка копируется, но терминал остается открытым.

Заранее спасибо.

//РЕДАКТИРОВАТЬ

Первый скрипт (для запуска scrot)

 #!/usr/bin/env python
import os
import uuid
import time

def rstring(string_length=10):
    random = str(uuid.uuid4())
    random = random.upper()
    random = random.replace("-","")
    return random[0:string_length]

randomString = rstring(16)

os.system("scrot -s -q 100 /home/timon/screenshots/"   randomString   ".jpg")

while True:
    processRead = os.popen("ps aux | grep "scrot -s" | cat").read()
    if "scrot -s" not in processRead:
        time.sleep(1)
    else:
        break
        system.sleep(3)

os.system("/home/timon/.screenshot_stuff/./screen.sh /home/timon/screenshots/"   randomString   ".jpg")
 

Второй скрипт (для загрузки скриншота)

 #!/usr/bin/env bash

dest_url='https://cuntflaps.me/upload.php'
return_url='https://a.cuntflaps.me'

if [[ -n "${1}" ]]; then
    file="${1}"
    if [ -f "${file}" ]; then
        printf "Uploading ${file}..."
        my_output=$(curl --silent -sf -F files[]="@${file}" "${dest_url}")
        n=0  # Multipe tries
        while [[ $n -le 3 ]]; do
            printf "try #${n}...n"
            if [[ true ]]; then
                return_file=$(echo "$my_output" | grep "url" |  sed 's/,//g' | sed 's/\//g' | sed 's/"//g' | sed 's/url://g' | tr -d ' ')
                printf 'done.n'
                break
            else
                printf 'failed.n'
                ((n = n  1))
            fi
        done
            printf "$return_file" | xclip -selection clipboard amp;amp; pkill terminal
    else
        printf 'Error! File does not exist!n'
        exit 1
    fi
else
    printf 'Error! You must supply a filename to upload!n'
    exit 1
fi
 

Комментарии:

1. Зачем вам это нужно eval ?

2. Это для выполнения команд, не так ли?

3. Не совсем, это для добавления дополнительного уровня расширения / замены, который, по-видимому, не нужен в вашем случае. На самом деле он даже используется неправильно — он пытается запустить как команду вывод команды внутри $(...) .

4. Попробуйте просто printf "$link" | xclip -selection clipboard amp;amp; exit (без eval )

5. exit не закрывает его, терминал pkill уничтожает его перед получением ссылки.

Ответ №1:

Итак, в конце концов я придумал свое собственное решение.

Проблема, похоже, заключалась в самом xclip. Теперь я использую «xsel —clipboard —input», который, похоже, работает даже после прямого выхода.