디렉토리 이름에 슬래시가 필요한 것이 좋은 방법입니까?


9

bash 스크립트 사용자에게 디렉토리 경로를 인수로 전달하도록 요청하고 싶습니다. 다음 중 좋은 프로그래밍 방법은 무엇입니까?

  • 사용자가 후행 / (슬래시)를 입력해야합니다.
  • 사용자가 후행 / (슬래시)를 입력하지 않아야합니다.

3
참고 것을 rsync다르게 매우 중요한 방식으로 동작이 후행의 존재에 따라 /, 그래서 어떤 경우에는 당신은 일관성을 정상화 할 것, 그리고 다른 사람에 당신은 사용자가 무엇을 구현하기 위해 깨끗하게 통과 싶어 했다 (그들이 경우 그들이 말하고 있다는 것을 알았습니다 rsync).
sh1

최근에 나를 놀라게 한 또 다른 것은 디렉토리에 대한 심볼릭 링크 인 경우 ls -l dir와 다르게 행동 한다는 것 입니다. ls -l dir/dir
Flimm

답변:


27

모범 사례는 둘 다 가정하지 않는 것입니다.

경로 작성기 유틸리티 / 클래스에 액세스 할 수있는 경우이를 사용하여 코드를 작성하지 않으면 형식 중 하나를 수락하고 그에 따라 조치를 취하십시오.

후행 슬래시를 추가할지 여부를 기억하는 것보다 사용자에게 더 성가신 것은 없습니다.


6
적절한 명령 줄 도구를 사용하여 항상 구문 분석 경로 - : 추론 dirname, basename그리고 readlink. 가장 일반적인 문제는 ${path##*/}의 대체물로 사용 basename되지만 경로가 슬래시로 끝나는 경우 마지막 경로 요소 대신 빈 문자열을 반환합니다.
l0b0

1
유틸리티 클래스 사용시 +1 요즘 대부분의 프레임 워크에서 쉽게 할 수있는 길을 모을 때 개발자가 바퀴를 다시 발명 한 것을 몇 번이나 말할 수는 없습니다.
RationalGeek

1
또한 일부 응용 프로그램에서 특정 방식 으로이 작업을 수행해야 할 때 크게 화가납니다. 때로는 사용자가 경로를 쓰는 방법을 제어 할 수 없습니다. 때로는 경로를 작성하므로 예, 슬래시와 함께 또는 슬래시를 쓰지 않고 선택하지만 사용자가 TAB을 사용하여 자동 완성되는 경우 많은 쉘이 슬래시를 넣습니다. 사용자가 삭제해야합니까? 그리고 더 성가신 것은 인수로 전달 된 디렉토리에 후행 슬래시를 넣는 경우 응용 프로그램이 다르게 동작 할 때입니다 ( rsync내가보고 있습니다)
Carlos Campderrós

최근 rsync와 함께 사용하기 위해 사용자 입력에서 슬래시를 확인해야했습니다 (이것에 민감하기 때문에). @ChrisF가 지적했듯이, 어느 쪽도 가정하지 않는 것이 가장 좋습니다. : 나는 어느 쪽도 없다고 가정의 우아한 방법으로 다음과 같이 와서 ${STR}$(printf \\$(printf '%03o' $(($(printf '%d' "'${STR:(-1)}")==47?0:47))))나는 또한 명확성을위한 요점에 문서화 : 추가 또는 bash는 후행 슬래시 제거
존 마크 미첼을

10

bash는 여러 슬래시를 무시하므로 사용자가 경로에 슬래시를 입력하지 않고 슬래시를 직접 추가했다고 가정 할 수 있습니다.

cat /etc/hosts

같은

cat /////etc//////////hosts

따라서 스크립트는 다음과 같습니다.

echo -n "enter path: "
read path
if [ -f $path/myfile ]
then
  echo "found myfile!"
else
  echo "nope"
fi

사용자가 경로에 /를 입력했는지 여부를 걱정할 필요가 없습니다.


5
Nit : 그것은 bash행동 이 아닙니다 , 커널은 그것을합니다.
Blrfl

7

Jon Postel의 말은 RFC 760의 3.2 절에서 여기에 적용되는 훌륭한 조언이있었습니다 .

일반적으로 구현은 전송 동작에서 보수적이어야하며 수신 동작에서 자유로 워야합니다. 즉, 올바른 형식의 데이터 그램을 보내야하지만 해석 할 수있는 데이터 그램 (예 : 의미가 여전히 명확한 기술적 오류에 반대하지 않음)을 받아 들여야합니다.


3

개념 상 슬래시는 이름의 일부가 아닙니다. 슬래시는 이름 사이의 구분자 일뿐입니다. 내 홈 디렉토리는 / home / stefan /가 아니라 / home / stefan입니다.

후행 슬래시가 예상되지 않으면 ammoQ가 이미 언급했듯이 슬래시가 있으면 실패하지 않습니다. 그러나 슬래시를 인용 할 필요가 없으므로 이름과 변수를 쉽게 붙일 수 있습니다.

a="/home"
b="stefan"

dir=$a/$b

0

디렉토리에 후행 슬래시가 없어야하는 것은 콘솔에서 대화식으로 사용하기에 매우 성가신 일입니다. TAB을 자동 완성하면 디렉토리에 후행 슬래시가 자동으로 추가됩니다.

따라서 디렉토리가 슬래시로 지정되도록해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.