두 개의 매개변수를 허용하는 스크립트를 작성하세요. 첫 번째 매개변수는 접두사 문자열을 나타내고 두 번째 매개변수는 경로를 나타냅니다(절대 경로라고 가정). 작성하는 스크립트는 다음을 수행해야 합니다.
사용자가 하나의 인수(접두사 문자열)만 입력하면 작업 디렉터리 내에서 이름이 해당 접두사로 시작하는 모든 파일 목록을 표시해야 합니다. 사용자가 두 개의 매개변수인 접두사 문자열과 경로를 입력하는 경우. 그런 다음 스크립트는 두 번째 인수로 지정된 경로 내에서 이름이 접두사로 시작하는 모든 디렉터리 목록을 표시합니다. 스크립트를 실행하기 전에 스크립트는 작업 디렉터리 값을 반환해야 합니다.
답변1
#!/bin/sh
( cd -- "${2:-.}" && ls -d -- "$1"*${2:+/} )
그건,
cd
두 번째 인수가 제공한 디렉토리로 이동하거나,.
두 번째 인수가 제공되지 않거나 비어 있는 경우. 어떤 것도 옵션으로 해석되지--
않도록 하세요 .cd
$2
ls -d
첫 번째 인수로 시작하는 모든 이름에 대해 실행됩니다.-d
상장을 방지하다콘텐츠디렉터리 이름이 일치하는 모든 디렉터리입니다. 어떤 것도 옵션으로 해석되지--
않도록 하세요 . 두 번째 인수가 제공되면 패턴은 후행 1을 가져오므 로 디렉터리 이름만 일치됩니다.ls
$1
/
이 모든 것은 서브셸에서 발생하므로 cd
나머지 스크립트의 작업 디렉터리는 변경되지 않습니다(마지막 문장이 의미하는 바가 이것이라고 생각합니다). 해당 쉘이 source
스크립트를 실행하는 데 사용되지 않는 한 어떤 상황에서도 스크립트는 호출 쉘의 작업 디렉토리를 변경할 수 없으며 서브쉘은 이러한 일이 발생하는 것을 방지합니다. 따라서 작업 디렉터리는 스크립트가 실행되기 전의 상태로 복원("반환")됩니다.
답변2
이건 불가능 해. 스크립트를 실행하기 전의 작업 디렉토리를 명시적으로 "되돌릴" 수는 없습니다. 왜냐하면 스크립트에는 애초에 호출자의 작업 디렉터리를 변경할 수 있는 합리적인 방법이 없기 때문입니다. 바라보다:스크립트를 사용하여 호출 셸의 작업 디렉터리를 어떻게 변경할 수 있나요? 마지막 문장을 무시하고 계속합니다.
#!/bin/sh
PREFIX="$1"
DIR="$2"
if [ -z "$DIR" ]; then;
ls -d -- "$1"*
else
cd -- "$DIR" &&
ls -d -- "$1"*/
fi
cd --
꼭 필요한 것은 아닙니다. 이것이 해결하는 문제는 a로 시작하는 문자열이 명령에 대한 옵션 -
으로 해석될 수 있다는 것입니다 .cd
질문에 따르면 경로는 절대 경로이므로 항상 로 시작 /
하고 절대 로 시작하지 않습니다 -
. cd "$PATH"
충분할 것입니다. 하지만,ls --
예꼭 필요한.
디렉토리는 파일 유형입니다. 스크립트의 두 인수 형식은 디렉터리를 나열할 때만 필요합니다. 파일을 나열하려면 단일 인수 형식만 필요합니다. 디렉터리 및 일반 파일 외에도 파일에는 블록 장치, 문자 장치, 소켓 및 명명된 파이프("fifos"라고도 함)에 대한 특수 파일이 포함됩니다.
Linux(및 기타 구현)는 파일 유형 목록을 확장합니다. Linux에는 "위에 해당 사항 없음" 명령이 포함되어 있는데 stat
명령이 "이상한 파일".