오늘은 쉘 스크립트를 작성하고 있었습니다.
갑자기 나에게 질문이 생겼다.
cd /target_dir
둘 다 작동하기 때문입니다 cd /target_dir/
.
쉘 스크립트에서 경로 변수 끝에 슬래시를 추가해야 합니까?
그렇죠 .LOG_PATH=/data/nginx/logs
LOG_PATH=/data/nginx/logs/
Google에서 대략적인 검색을 했지만 이에 대한 논의를 찾을 수 없었습니다. 어쩌면 너무 기본적인 것일까요?
지금은 어떤 스타일을 선택해야 할지 정말 고민이에요.
하지만 저는 LOG_PATH=/target_dir/
좀 더 스타일을 선호해요.
bash로 자동 완성을 수행하면 결과가 슬래시로 표시되기 때문입니다.
이에 대해 어떻게 생각하며 그 이유는 무엇입니까?
답변1
POSIX에 따르면:
경로 이름 정의:
파일을 식별하는 데 사용되는 문자열입니다. 선택적 시작이 있습니다<슬래시>문자 다음에 0개 이상의 파일 이름이 옵니다.<슬래시>수치.경로 이름에는 선택적으로 하나 이상의 후행이 포함될 수 있습니다.<슬래시>수치.연속으로 여러 번<슬래시>문자는 동일한 것으로 간주됩니다.<슬래시>, 정확히 두 개의 선행하는 경우를 제외하고<슬래시>수치.
답변2
안전을 위해 슬래시를 포함하세요. 이로 인해 경로를 연결할 때 여러 개의 슬래시가 발생할 수 있지만 적어도 문제는 방지됩니다.
몇 가지 예: rsync
후행 슬래시가 포함된 경우 경로를 다르게 처리합니다(동기화됨).저것다른 하위 디렉토리를 만드는 대신 디렉토리). 디렉토리에 대한 심볼릭 링크는 뒤에 슬래시가 없을 때 예상치 못한 방식으로 작동하는 경우가 있습니다. 적어도 쉘 완성은 엉망이 됩니다. 호출하는 명령/스크립트에 슬래시 확인에 의존하는 특별한 동작이 있는지 알 수 없습니다. 덮어쓰는 것을 방지할 수도 있습니다. 예를 들어, 이라는 파일이 있는데 foo
디렉토리라고 잘못 생각하여 그 안에 무언가를 옮기고 싶은 경우 mv bar foo
파일을 덮어쓰지만(데이터 손실, 잠재적인 재해) mv bar foo/
불평만 하고 아무 작업도 수행하지 않습니다.
요약하자면, 대부분의 경우에는 중요하지 않지만 슬래시를 사용하여 자신을 보호하고 스크립트에서 수행하려는 작업을 인간 독자에게 더 명확하게 전달해야 합니다. 변수가 슬래시로 끝나는 경우, 일반 관찰자는 그것이 디렉토리를 참조하고 수정이 필요할 경우 이를 올바르게 사용할 것임을 즉시 판단할 것입니다.
답변3
아니요, 이러면 안 됩니다. 불필요한 슬래시( /
)를 추가합니다.
예
bin
Java 디렉토리를 변수로 내보내고 싶다고 가정해 보겠습니다 PATH
.
export PATH=$PATH:/opt/jre1.7.0_45/bin/
바로 확인해보세요,
user@host:~$ which java
/opt/jre1.7.0_45/bin//java
java 앞에 추가 슬래시( )가 있다는 점에 유의하세요 /
. 운 좋게도 이 경우에만 작동합니다.