Каждый процессор имеет очередь выполнения и может захотеть получить доступ к другим очередям выполнения других процессоров. Блокировка требуется, чтобы избежать повреждения, когда очередь выполнения управляется двумя или более процессорами.
Ссылка: Разработка ядра Linux Робертом Лавом (частично доступно по адресу http://www.informit.com/articles/article.aspx?p=101760&seqNum=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://}'
при наличии пробелов в содержимом буфера обмена.
Как вы знаете, псевдоним
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
Это также работает с именами файлов, содержащими пробелы.
Заметим, однако, что:
Имена файлов, отображаемые 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