나는 디렉토리에 ,,,,, /etc/systemd/system
라는 4개의 서비스 파일을 작성했는데 sybase.service
모두 sybase-backup.service
매우 잘 작동합니다.sybase-rs.service
sybase-rsm.service
다음을 사용하여 목록을 나열하려고 할 때 systemctl list-units sybase*
:
0개의 로드된 장치가 나열되었습니다. 로드되었지만 비활성화된 장치도 --all을 사용하여 볼 수 있습니다.
systemctl list-units sybase\*
또는 사용하면 systemctl list-units "sybase*"
올바른 결과를 얻습니다.
systemctl list-units ssh*
그러나 또는 같은 일부 다른 서비스의 경우 systemctl list-units "ssh*"
둘 다 작동합니다.
그렇다면 왜 그러한 차이가 있습니까?
답변1
당신은해야합니다인용 아니면 탈출명령에 인수로 전달되는 와일드카드(*), 캐럿(^) 또는 달러 기호($)와 같은 특수 문자. 그렇지 않으면 셸에 의해 확장됩니다. 보다확장특수 문자의 전체 목록을 보려면 bash.1 및 glob.7 매뉴얼 페이지의 섹션을 참조하세요.
배쉬를 다루는 방법*
glob.7
맨페이지 에서
빈 목록 위에 제공된 간단하고 명확한 규칙인 "와일드카드 패턴을 일치하는 경로 이름 목록으로 확장"은 원래 UNIX 정의였습니다. 아래와 같이 패턴을 빈 목록으로 확장할 수 있습니다.
xv -wait 0 *.gif *.jpg
*.gif 파일이 존재하지 않을 수 있습니다(오류가 아닙니다). 하지만,POSIX에서는 구문이 올바르지 않거나 일치하는 경로 이름 목록이 비어 있는 경우 와일드카드 패턴을 유지해야 합니다.. Bash를 통해 다음을 사용하여 고전적인 동작을 강제할 수 있습니다.
*
Bash의 특정 동작 사례에서 이와 같은 패턴이 ssh*
현재 디렉터리에 많은 파일을 포함할 수 있는 경우(예: ) ssh_config sshd_config
는 있는 그대로 확장되거나 명령에 있는 그대로 전달됩니다. 이 동작에 의존해서는 안 됩니다. 매번 특수 문자를 인용하거나 이스케이프 처리하는 것이 가장 좋습니다.
명령 분석
systemctl list-units "ssh*" systemctl list-units sybase* 또는 systemctl list-units "sybase*"는 올바른 결과를 제공합니다.
이러한 명령은 모든 "*"가 인용되거나 이스케이프되어 systemctl
.
systemctl 목록 장치 ssh*
이 명령은 현재 작업 디렉토리에 ssh로 시작하는 파일이 포함되어 있지 않은 경우 작동합니다. 그러나 현재 작업 디렉터리에 이러한 파일이 포함되어 있으면 실패합니다.
systemctl 목록 단위 sybase*
이 명령이 실행되는 작업 디렉터리에는 sybase.
"Therefore"로 시작하는 파일이 포함되어 sybase*
있으며 이러한 파일 목록으로 확장된 다음 systemctl
명령에 전달됩니다.