Bash 기능은 공백이 있는 디렉토리를 허용하지 않는 것 같습니다.

Bash 기능은 공백이 있는 디렉토리를 허용하지 않는 것 같습니다.

다음 함수를 만들었습니다 ~/.bashrc.

function cl {cd $1; echo $1; ls -al $1}

(실제로 읽는 내용을 확인하기 위해 echo 명령을 거기에 넣었습니다)

내 홈 디렉토리에 "samples 폴더"라는 폴더를 만들고 cl "example folder"and를 시도했습니다. 그들은 모두 같은 것을 인쇄합니다:cl example\ foldercl ~/"example folder"

-bash: cd: too many arguments
example folder

다음은 현재 디렉토리만 나열하는 ls 명령입니다.

그렇다면 이 문제를 해결할 수 있는 방법이 있을까요? 공백이 포함된 디렉토리를 전달하는 방법은 무엇입니까?

답변1

function cl {cd $1; echo $1; ls -al $1}

Bash 구문보다 zsh 구문에 더 가깝지만 그럼에도 불구하고 여전히 많은 문제가 있습니다.

존재하다bash

  • 그 뒤에는 공백이 필요 {하고 그 앞에는 }명령 구분 기호( ;, &, 개행 문자이지만 그것도 괜찮습니다)가 필요합니다. )zsh에서는 작동하지 않습니다.
  • 매개변수 확장은 따옴표로 묶어야 합니다. 그렇지 않으면 분할+glob을 거치게 됩니다. zsh에서는 작동하지 않습니다.
  • 변수 데이터를 옵션이 아닌 일반 매개변수로 전달하는 경우 옵션 닫는 태그( )를 앞에 붙여야 --데이터가 옵션으로 처리되는 것을 방지 할 수 있습니다 -.
  • cd다음 명령을 실행한 후 종료 상태를 확인하지 않습니다.
  • echo임의의 데이터를 출력하는 데 사용할 수 없습니다. 대신 사용하십시오 printf.
  • cd편집 후 $1상대 경로인 경우 ls -la $1(또는 더 정확하게는 ls -la -- "$1") 더 이상 작동하지 않습니다 . $1아마도 당신은 ls -la(또는 ls -lA)만을 원할 것입니다.
  • 스크립트에서는 일반적으로 cd와 함께 사용 하고 다른 언어 처럼 작동하도록 설정되지 않거나 비어 있는지 -P확인한 후 ( ) 사용하려고 합니다. 그러나 대화형 셸에서 함수를 사용하는 경우에는 적용되지 않을 수 있습니다.$CDPATHCDPATH= cd -P -- "$1"chdir()
  • function f { ...; }함수 정의를 위한 ksh 구문입니다. 표준 구문보다 이를 선호 bash할 이유가 없습니다 .f() { ...; }

그래서:

cl() {
  cd -- "$1" || return
  printf '%s\n' "$1"
  ls -Al
}

인수가 전달되지 않으면 cd디렉토리가 다음으로 변경됩니다.디렉토리( 또는 cd와 유사 ).cd ~cd "$HOME"

그러나 여기서 cl인수 없이 호출 하면 인수가 전혀 없는(그리고 질식할 수도 있는) "$1"대신 빈 인수로 확장됩니다 . 인수 없이 if를 cd호출하려면 ( 홈 디렉터리로 이동하여 거기에 있는 파일을 나열함) 로 바꾸거나 로 받은 것과 동일한 인수 목록으로 호출할 수 있습니다. 예를 들어 or를 사용할 수 있습니다.cdclcl"$1"${1+"$1"}cdcl"$@"cl -P ../bincl -- -dir-whose-name-starts-with-dash

그런 다음 첫 번째 인수 나 첫 번째 인수만 cd사용하는 대신 나중에 현재 작업 디렉터리를 인쇄할 수 있습니다 .printf '%s\n' "$PWD"pwd

cl() {
  cd "$@" || return
  pwd
  ls -Al
}

추가 자료:

관련 정보