나는 한 사람을 만났다멋진 방법.bashrc 파일에 기능을 추가하여 두 개 이상의 디렉터리 수준으로 이동하세요.
.bashrc 파일을 열고 다음 함수를 삽입하세요.
#user defined functions
function cd_up() {
cd $(printf "%0.s../" $(seq 1 $1 ));
}
alias 'cd..'='cd_up'
어떻게 읽는지 알고 싶습니다.
어떤 언어로 쓰여 있나요?
답변1
의 내용은 .bashrc
스크립트나 대화형 셸을 실행하는 것처럼 Bash 자체에 의해 실행됩니다. 이는 많은 확장 기능을 갖춘 POSIX 쉘 언어의 변형입니다(일부는 주로 Ksh와 같은 다른 쉘에서 빌려왔고 일부는 Bash 자체에서 생성됨).
여기서는 function cd_up() { ... ; }
함수가 정의됩니다. 표준 형식은 키워드 cd_up() { ... ; }
없이 입니다 function
. 이는 $(...)
내부적으로 명령을 실행하고 해당 출력을 명령줄 인수로 사용하는 명령 대체입니다.
이것이 printf "%0.s../"
바로 비결입니다. printf
형식 문자열(C 함수와 유사) printf()
과 형식 문자열을 사용하여 인쇄되는 여러 인수를 허용합니다. 중요한 점은 모든 인수를 사용하는 데 필요한 만큼 형식 문자열을 반복한다는 점입니다(C 함수는 이를 수행하지 않으며 수행할 수도 없습니다). 지정자는 %0.s
인수를 너비가 0인 문자열로 인쇄하도록 지시하므로 실제로 인수는 다음과 같습니다.아니요인쇄.
하지만 변함없는 부분../
예각 인수에 대해 한 번 인쇄합니다. 즉, printf "%0.s../" a b
두 번 인쇄됩니다. 이는 $(seq 1 $1)
또 다른 명령 대체이며 seq
숫자 목록이 인쇄되므로 필요한 수의 인수를 제공하는 데 사용됩니다 printf
. $1
현재 함수의 첫 번째 매개변수입니다 cd_up
.
예를 들어 cd_up 2
먼저 실행 seq 1 2
하고 인쇄합니다 1 2
. 이는 매개변수로 전달되므로 어느 것이 인쇄되는지 printf
얻을 수 있습니다 . 디렉터리 트리에서 두 수준 위로 전달되어 실행 됩니다 .printf "%0.s../" 1 2
../../
cd
cd ../../
를 사용하면 set -x
쉘이 실제로 실행하는 명령을 볼 수 있습니다. Bash는 다음 표기법으로 중첩 수준을 나타냅니다 +
.
/tmp/foo$ set -x
/tmp/foo$ cd_up 2
+ cd_up 2
+++ seq 1 2
++ printf %0.s../ 1 2
+ cd ../../
/$
별거 아니니 참고하세요무엇출력은 seq
올바른 수의 단어를 가지고 있다는 것입니다. 명령 대체가 인용되지 않았기 때문에 출력은 다음과 같이 진행됩니다.분사, 이는 공백에서 여러 인수로 분할됨을 의미합니다. printf "%0.s../" "$(seq 1 $1)"
항상 형식 문자열 뒤에 하나의 인수만 전달하십시오. (링크된 페이지의 예를 참조하세요.)
유사한 함수를 작성하지만 기술이 덜 필요한 또 다른 방법은 간단한 루프를 사용하는 것입니다. 거의 POSIX sh에 있습니다( local
POSIX 아님):
cd_up() {
local i=$1
while [ "$i" -gt 0 ]; do
cd ..
i=$((i - 1))
done
}
또는 Bash/Zsh에서는 연산 for 루프를 사용합니다.
cd_up() {
local i
for (( i=$1; i > 0; i-- )); do
cd ..
done
}
버전은 한 번만 실행되므로 중간 디렉터리가 아닌 원래 디렉터리로 돌아가기 때문에 printf
더 좋습니다 . (이 문제를 해결하는 것은 연습문제로 남습니다.)cd
cd -
쉘 언어에 대한 리소스는 다음을 참조하세요.
답변2
bashrc는 bash가 대화형으로 시작될 때마다 실행되는 bash 스크립트입니다.