➜ ~ cat .zshrc | grep xclip
alias c="xclip -selection c"
alias -g v='"$(xclip -selection c -o)"'
➜ ~ v
zsh: 没有那个文件或目录: file:///home/roach/Downloads/pure.png
➜ ~
"해당 파일이나 디렉터리가 없습니다"는 중국어로 "파일이나 디렉터리가 없습니다"라는 뜻입니다.
에 있는 파일을 복사하고 싶습니다 /home/roach/Downloads/pure.png
. Dolphin KDE에서 선택하고 복사할 때(마우스 오른쪽 버튼을 클릭한 다음 복사를 클릭) 위에 표시된 /home/roach/Downloads/pure.png
것 대신에 그것을 얻을 수 있는 방법이 있습니까?file:///home/roach/Downloads/pure.png
sed
추가 문자 제거 file://
와 같은 명령을 사용하고 있다고 생각했지만 올바른 방법을 얻지 못했습니다.
➜ ~ alias -g v='"$(xclip -selection c -o)|sed -e 's/file:\/\///'"'
➜ ~ v
zsh: 没有那个文件或目录: file:///home/roach/Downloads/pure.png|sed -e s/file:////
➜ ~
그렇다면 내 것을 어떻게 수정합니까 alias -g v
?
답변1
쉘 자체가 이러한 교체를 수행할 수 있으므로 외부 프로그램의 더 비싼 포크 및 실행을 피할 수 있습니다. 자세한 내용은 "매개변수 확장"을 참조하십시오 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://}'
클립보드 내용에 공백이 있는 경우.
답변2
아시다시피 별칭은
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