다음 스크립트를 사용하려고 합니다.
#!/usr/bin/env bash
# Edit xselection in gvim
xsel > /tmp/xselection
gvim /tmp/xselection
xsel < /tmp/xselection
그러나 마지막 줄은 파일을 xselection에 올바르게 로드하지 않는 것 같습니다. 스크립트를 호출한 후 즉시 이 줄을 실행하면 성공합니다. 이유를 모르겠습니다. 내가 무엇을 놓치고 있나요?
답변1
gvim을 종료할 때까지 gvim 호출이 차단되지 않고 즉시 반환된다는 사실을 무시하고 있습니다. 따라서 xsel < /tmp/xselection
파일은 편집되기 전에 처리됩니다.
답변2
결국 두 개/세 개 답변의 정보를 병합하여 다음을 생성했습니다.
#!/usr/bin/env bash
# Edit xselection in gvim
xsel > /tmp/xselection
gvim -f /tmp/xselection
xsel -i < /tmp/xselection
답변3
이 옵션을 사용해야 합니다 -i
. ( -o
기본값입니다)
xsel -i </tmp/xselection
# -o, --output write the selection to standard output.
# -i, --input read standard input into the selection.*
이 옵션은 X에서 사용할 수 있습니다.기초적인선택 항목(클립보드 아님)이므로 결과를 보려면 중앙 버튼을 클릭해야 합니다. 나는 그것을 테스트하기 위해 마지막 명령 전에 잠시 멈췄습니다. 이를 통해 최종 명령을 실행하기 전에 일부 추가 텍스트를 수동으로 선택할 수 있습니다. 중앙을 클릭했는데 제대로 작동했고... 지연도 없었습니다.
하지만 지체 없이 테스트해도 원래 선택이 그대로 선택되어 있기 때문에 아무 것도 증명되지 않습니다... 물론 동시에 다른 것을 선택하면 스크립트의 기본 선택을 잃게 됩니다.
아마도 귀하의 질문은 -i
이 두 가지 옵션과 스크립팅 프로세스에서 분리하는 방법에 대한 Paul Tomblin의 답변의 조합일 것입니다.gvim
답변4
내 이전 답변은 약간 혼잡하고 불완전해지고 있습니다(그리고 편집 반복은 한 번만 남았습니다). 따라서 여기에 이 두 가지 아이디어를 모두 포함하는 수정된 답변이 있습니다.옵션그리고분리.
Giles의 의견(이전 답변)에 대한 후속 조치에서 언급했듯이 -i
해당 옵션이 필요한 경우(테스트 Ubuntu 시스템에서)가 분명히 있습니다. 따라서 여기서는 -i
및 .-o
"gvim"은 스크립트 프로세스에서 분리되어 있기 때문에 기다리지 않고 즉시 다음 명령을 실행합니다. (Paul Tomblin은 이미 그의 답변에서 이것을 지적했습니다).
wait
bash 명령은 다음에서만 작동하므로 사용할 수 없습니다.하위 프로세스. 해결 방법으로 대기할 루프를 설정할 수 있습니다.어린이가 아닌프로세스가 종료됩니다. 이는 매번 새로운 프로세스로 시작되는 편집기에 적용됩니다(예: 이 예에서는 "gvim").
수정된 스크립트입니다
xsel -o >/tmp/xselection
gvim /tmp/xselection 2>/dev/null
pid=$(pgrep -n "gvim") # get gvim's pid and wait
while kill -0 "$pid" 2>/dev/null; do sleep 0.5; done
xsel -i </tmp/xselection
위의 내용은 제어가 스크립트로 다시 전달될 때 gvim` pid가 이미 설정되어 있다고 가정합니다. 높은 시스템 부하에서 다음 명령이 실행될 때 pid가 아직 설정되지 않은 경우 gvim을 기다리는 이 방법이 작동합니다.
xsel -o >/tmp/xselection
pre=$(pgrep -n gvim) # get previous gvim pid
gvim /tmp/xselection 2>/dev/null
while pid=$(pgrep -n "gvim"); [[ "$pid" == "$pre" ]]; do sleep .1; done
while kill -0 "$pid" 2>/dev/null; do sleep 0.5; done
xsel -i </tmp/xselection