더 나은 것

더 나은 것

function내 파일에 사본이 있습니다 .bashrc. 나는 그것이 무엇을 하는지 안다. X 디렉토리를 추가한다.cd

여기있어:

up()
{
    local d=""
    limit=$1
    for ((i=1 ; i <= limit ; i++))
      do
        d=$d/..
      done
    d=$(echo $d | sed 's/^\///')
    if [ -z "$d" ]; then
      d=..
    fi
    cd $d
}

그런데 이 세 가지를 나에게 설명해 주실 수 있나요?

  1. d=$d/..
  2. sed 's/^\///'
  3. d=..

이렇게 하면 안 되는 이유:

up()
{
    limit=$1

    for ((i=1 ; i <= limit ; i++))
    do
        cd ..
    done
}

용법:

<<<>>>~$ up 3
<<<>>>/$

답변1

  1. d=$d/../..변수에 추가된 현재 내용입니다 d. d아무것도 없이 시작한 다음 첫 번째 반복이 성공하고 /..두 번째 반복 /../..등이 계속됩니다.

  2. sed 's/^\///'첫 번째 것을 제거 /하면 가 /../..됩니다  ../..(매개변수 확장을 사용하여 수행할 수 있음 d=${d#/}).

  3. d=..해당 조건의 맥락에서만 의미가 있습니다.

    if [ -z "$d" ]; then
      d=..
    fi
    

    이렇게 하면 d이 시점에서 비어 있으면 상위 디렉터리로 리디렉션됩니다. ( up매개변수가 없는 것과 동일합니다 cd ...)

이 접근 방식은 한 단계에서 (사용자 관점에서) 이전 디렉터리로 돌아갈 수 있는 기능을 cd ..유지하므로 반복보다 낫습니다 .cd -

이 기능은 다음과 같이 단순화될 수 있습니다.

up() {
  local d=..
  for ((i = 1; i < ${1:-1}; i++)); do d=$d/..; done
  cd $d
}

이는 우리가 적어도 한 레벨 위로 올라가서 추가하기를 원한다고 가정합니다.n-1/수준이므로 선행을 제거 하거나 비어 있는지 확인할 필요가 없습니다 $d.

Athena 사용 jot( athena-jotDebian의 패키지):

up() { cd $(jot -b .. -s / "${1:-1}"); }

(기준으로변형다음의 제안글렌 잭맨).

답변2

그런데 이 세 가지를 나에게 설명해 주실 수 있나요?

  1. d=$d/..

    이는 var의 현재 내용을 dvar와 연결 /..하고 다시 할당합니다 d.
    최종 결과 d/../../../...

  2. sed 's/^///'

    게시한 코드에 /제공된 문자열에서 선행(echo $d)을 제거합니다 . 백슬래시를 피하기 위해 작성하는 것이 더 나을 수도 있습니다. d
    sed 's|^/||'

    또 다른 옵션(더 빠르고 간단함)은 d=${d#/}.

  3. 디=..

    ..var 에 문자열을 할당합니다 d.
    이는 d최소한하나 ..테스트 결과 if [ -z "$d" ]; thenvar d가 비어 있는 것으로 표시되는 경우. 이는 sed 명령이 문자를 제거하기 때문에 발생할 수 있습니다 d.
    d에서 문자를 제거할 필요가 없으면 sed또는 이 필요하지 않습니다 if.


질문의 코드는 항상 하나 이상의 디렉터리 위로 이동합니다.

더 나은 것

  • local d변수가 비어 있는지 확인하는 것만으로도 충분하며 다른 것은 필요하지 않습니다.
    그러나 local은 bash 또는 dash와 같은 특정 셸에서만 작동합니다. 구체적으로 ksh(as yash)에는 명령이 없습니다 local. 보다 이식성이 뛰어난 솔루션은 다음과 같습니다.

    [ "$KSH_VERSION$YASH_VERSION" ] && typeset c='' d='' i='' || local c='' d='' i=''
    
  • 구문은 for((이식 가능하지 않습니다. 다음과 같은 것을 사용하는 것이 더 좋습니다:

    while [ "$((i+=1))" -lt "$limit" ]; do
    
  • 강한.
    함수의 첫 번째 인수에 지정된 값이 음수 또는 리터럴일 수 있는 경우 함수는 이러한 값을 강력하게 처리할 수 있어야 합니다.
    먼저 값을 숫자로만 제한하겠습니다. (저는 c에 사용하겠습니다 count):

    c=${1%%[!0-9]*}
    

    그런 다음 개수 값을 양수 값으로만 ​​제한합니다.

    let "c = (c>0)?c:0"
    

이 함수는 0 또는 모든 텍스트(오류 없이)를 허용합니다.

up()
{
    [ "$KSH_VERSION$YASH_VERSION" ] && typeset c='' d='' i='' || local c='' d='' i=''
    c=${1%%[!0-9]*}
    c=$(((c>0)?c:0))
    while [ "$((i+=1))" -le "$c" ]; do d="$d../"; done
    echo \
        cd "${d%/}"         # Removing the trailing / is not really needed for cd
                            # but it is nice to know it could be done cleanly.
}

up 2
up 0
up asdf

echo \기능을 테스트한 후에는 삭제하세요.

관련 정보