하이픈이 포함된 매개변수의 경우기타 지정자슬래시로 대체됩니다.
일부 유닛 이름은 파일 시스템 네임스페이스에 존재하는 경로를 반영합니다. 예: 장치 유닛 dev-sda.device는 파일 시스템 네임스페이스에 장치 노드 /dev/sda가 있는 장치를 나타냅니다. 해당되는 경우 결과를 파일 이름의 일부로 사용할 수 있도록 경로 이름을 이스케이프하는 데 특별한 방법이 사용됩니다. 기본적으로 경로가 주어지면 "/"는 "-"로 대체되고 ASCII가 아닌 다른 모든 영숫자 문자는 C 스타일 "\x2d" 이스케이프로 대체됩니다.
하이픈이 포함된 매개변수를 전달하려고 하는데 systemd 장치가 하이픈을 슬래시로 바꾸지 않는 것을 확인했습니다. 그러면 하이픈은 항상 대체되지 않나요? 아니면 내가 뭔가를 잘못 해석하고 있는 걸까?
기본적으로 나는 단위에서 실행하는 실행 파일에 문자열을 전달하는 시스템 단위에 문자열을 전달하고 싶습니다.
예를 들어:
[email protected]
실행하려는 유닛 내부에 유닛이 있다고 가정해 보겠습니다 .
/usr/local/bin/my_script param-with-hyphen
다음과 같이 하이픈이 포함된 매개변수를 다음 유닛에 전달하려고 하면:
$ systemctl start [email protected]
ExecStart=/usr/local/bin/my_script %i
문자열을 로 변환하지 않습니까 param/with/hyphen
?
내 테스트에서는 하이픈이 대체되지 않았습니다.
나는 단위를 만들었습니다:/etc/systemd/system/[email protected]
[Unit]
Description=Test arg %i
[Service]
ExecStart=/usr/bin/echo "arg: %i"
그러다가 도망갔어systemctl start testunit@test-hyphen
결과는 하이픈을 대체하지 않습니다.
$ journalctl -u testunit@test-hyphen
Journal file /var/log/journal/f41c5d772fa24834926605125d59db1b/user-1000@4cc6a20c4391418eb972f65e6ecfafbe-000000000000043c-0005351d59c7b07b.journal is truncated, ignoring file.
-- Logs begin at Fri 2016-06-10 18:15:25 PDT, end at Sat 2016-09-24 23:12:42 PDT
Sep 24 23:12:25 Archon systemd[1]: Started Test arg test-hyphen.
Sep 24 23:12:25 Archon echo[6302]: arg: test-hyphen
답변1
문서를 잘못 읽었습니다.
기본적으로 경로가 지정되면 "/"는 "-"로 대체됩니다.
파일 시스템 경로의 슬래시는 대시로 바뀌지만 대시가 슬래시로 바뀌는 것에 대해서는 아무 말도 하지 않습니다. 이것이 바로 테스트에서 대시가 그대로 유지되는 이유입니다. 하지만 일어날 수 있는 일은 대시가 파이프 아래로 이동하는 \x2d
것으로 해석되는 로 대체된다는 것입니다 .-
ASCII가 아닌 다른 모든 영숫자 문자는 C 스타일 "\x2d" 이스케이프 문자로 대체됩니다.
"지정자" 부분은 인수를 이스케이프하거나 이스케이프하지 않는 방법을 표시하는 것 외에는 여기서 많은 관련성이 없는 것 같습니다.
답변2
이것문서연결한 설명은 바로 다음 형식에 있습니다. 이스케이프는 자동으로 취소되지 않지만 명시적으로 요청해야 합니다.
'%i' 인스턴스 이름: 인스턴스화된 유닛의 경우: '@' 문자와 유닛 이름 접미사 사이의 문자열입니다.
'%I' 이스케이프되지 않은 인스턴스 이름: '%i'와 동일하지만 이스케이프가 취소되었습니다.
%I
대신 을 사용하면 %i
설명대로 대시가 하이픈으로 변경되는 것을 볼 수 있습니다.
(제게는 표현이 조금 모호합니다. "Unescaped"는 값이 이스케이프되지 않았다는 의미로 해석될 수 있지만 여기서는 이스케이프가 취소되었음을 의미합니다.)