Как получить путь к файлу, который был выбран, и скопировать его в дельфин KDE и вставить в zsh?

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

Ссылка: Разработка ядра Linux Робертом Лавом (частично доступно по адресу http://www.informit.com/articles/article.aspx?p=101760&seqNum=2 )

0
17.02.2019, 16:51
2 ответа

Сама оболочка может выполнить эту замену, избегая более дорогой форк и exec внешней программы. См. "параметр расширение" в zshexpn(1)для подробностей.

% x=file:///etc/passswd; print ${x#file://}
/etc/passswd

Итак, в вашем случае, возможно, что-то вроде

% alias -g v='${$(xclip -selection c -o)#file://}'
% print -l v
/etc/passswd

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

Вы также можете решить, как будут выглядеть вещи с пробелами в имени. обрабатывается; print -lпокажет разницу между:

alias -g v='${$(xclip -selection c -o)#file://}'
alias -g v='${"$(xclip -selection c -o)"#file://}'

при наличии пробелов в содержимом буфера обмена.

1
28.01.2020, 02:30

Как вы знаете, псевдоним

alias -g v='"$(xclip -selection c -o)"'

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

Ваше решение на основеsed-будет работать, если вы правильно используете подстановку команд($(...))и цитирование:

alias -g v='$(xclip -selection clipboard -o | sed '"'"'s|^file://||'"'"')'

Здесь xclipпередает содержимое буфера обмена в sed, что удаляет часть file://в его начале (шаблон закреплен, обратите внимание на^). Отсутствие /в качестве разделителя команд sв сценарии sedделает его более читабельным и устраняет необходимость экранирования /в шаблоне.
Подстановка команды означает, что вывод конвейера заменяется при вызове v.

Затем вы можете использовать его как:

cp -- v /path/to/destination

Имейте в виду, что это затруднит работу с файлом с именем vв текущем рабочем каталоге, потому что литерал vвсегда будет заменен. В качестве обходного пути вы сможете использовать относительный путь ./v.
(Кроме того, учтите, что некоторые программы принимают однобуквенные опции без префикса -, например. совершенно законный (, но не POSIX)ps v. Однобуквенные глобальные псевдонимы -просто небезопасны ).

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

В качестве альтернативы,вы можете избежать глобального псевдонима и определить:

alias v="xclip -selection clipboard -o | sed 's|^file://||'"

, который можно использовать как:

cp -- "$(v)" /path/to/destination

Это также работает с именами файлов, содержащими пробелы.

Заметим, однако, что:

  1. Использование возможностей замены оболочки, как объяснено в ответе thrig , было бы более эффективным.
  2. Имена файлов, отображаемые Dolphin и копируемые в буфер обмена, закодированы и поэтому не подходят для использования оболочкой, если они содержат необычные символы. Например:

    touch $'file with a\nnewline'
    # Copied in Dolphin
    % echo "$(v)"
    file with a%0Anewline
    % cat "$(v)"
    cat: '/path/to/file with a%0Anewline': No such file or directory
    
1
28.01.2020, 02:30

Теги

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