나는 이것을 많이 반복하고 있습니다.
mkdir longtitleproject
cd longtitleproject
디렉토리 이름을 반복하지 않고 한 줄로 수행할 수 있는 방법이 있습니까? 나는 여기서 파티를 하고 있다.
답변1
이것이 당신에게 필요한 단일 라이너입니다. 추가 구성이 필요하지 않습니다.
mkdir longtitleproject && cd $_
Bash에서 변수는 $_
이전 명령에 제공된 마지막 인수입니다. 이 경우 방금 생성한 디렉터리의 이름입니다. 설명된 대로 man bash
:
_ At shell startup, set to the absolute pathname used to invoke
the shell or shell script being executed as passed in the envi‐
ronment or argument list. Subsequently, expands to the last
argument to the previous command, after expansion. Also set to
the full pathname used to invoke each command executed and
placed in the environment exported to that command. When check‐
ing mail, this parameter holds the name of the mail file cur‐
rently being checked."$_" is the last argument of the previous command.
cd $_
이전 명령의 마지막 인수가 제공되었기 cd !$
때문에 가 아니라 cd !$
이전 명령의 마지막 인수를 검색하는 데 사용됩니다.쉘 역사에서:
cd ~/
mkdir folder && cd !$
드디어 집에 도착했어요 (혹은 ~/)
cd ~/
mkdir newfolder && cd $_
집 아래에 새 폴더가 생성됩니다! (또는 ~/newfolder )
답변2
내장된 명령은 없지만 mkdir
then을 호출하는 함수를 쉽게 작성할 수 있습니다 cd
.
mkcd () {
mkdir "$1"
cd "$1"
}
이 코드를 ~/.bashrc
파일에 넣으세요( ~/.kshrc
ksh 사용자 또는 ~/.zshrc
zsh 사용자의 경우). 이라는 함수를 정의합니다 mkcd
. "$1"
함수를 실행하면 함수의 인수로 대체됩니다.
이 간단한 버전에는 몇 가지 결함이 있습니다.
- 일련의 하위 디렉터리를 한 번에 생성할 수 없습니다. 수정 :
-p
옵션을 .mkdir
mkcd mydierctory/newsub
mydierctory
mydierctory/newsub
newsub
mydirectory
- 인수가
-
but 으로 시작-
하면mkdir
and 는cd
이를 옵션으로 해석합니다. 그렇다면-
그것은cd
의미로 해석될 것이다$OLDPWD
.+
뒤에 0개 이상의 숫자가 오면 zshcd
는 이를 디렉토리 스택에 대한 인덱스로 해석합니다.--
인수 앞에 전달 하면 첫 번째 문제는 해결되지만 나머지 두 문제는 해결되지 않습니다../
상대 경로인 경우 매개변수를 앞에 추가하면 이러한 모든 문제를 해결할 수 있습니다. mkdir
Not FollowCDPATH
, 그러나 따라가기 때문에 시작 하지 않는 값 (다소 특이한 구성) 을cd
설정하면 방금 생성한 디렉터리와 다른 디렉터리로 이동될 수 있습니다. 상대 경로 앞에 접두사를 붙이면 이 문제가 해결됩니다( 무시됩니다).CDPATH
.
cd
./
CDPATH
mkdir
실패 하면 실행을 시도합니다cd
. 수정:&&
두 명령을 분리하는 데 사용됩니다.
여전히 매우 간단합니다.
mkcd () {
case "$1" in /*) :;; *) set -- "./$1";; esac
mkdir -p "$1" && cd "$1"
}
이 버전을 사용하면 go 에 대한 인수가 심볼릭 링크를 포함 하고 전달하는 경우와 같은 극단적인 경우에 방금 생성된 디렉터리와 다른 디렉터리 cd
로 이동하는 것이 여전히 가능합니다 . 예를 들어, 현재 디렉토리가 에 대한 심볼릭 링크이고 이면 ( 즉 ) 에 대한 변경을 생성 합니다 . 쉘이 현재 디렉토리의 심볼릭 링크도 추적하므로 인수에서 심볼릭 링크를 찾는 것만으로는 충분하지 않습니다. 따라서 새 디렉토리( )로 변경하는 대신 이 문제를 해결하는 방법은 내장 함수가 모든 경로를 먼저 확인하도록 하는 것 입니다. 구성 요소( 존재하지 않는 경우 사용하는 것은 의미가 없으므로 경로 구성 요소를 볼 필요가 없습니다).mkdir
mkcd
..
/tmp/here
mylink
/somewhere/else
mkdir mylink/../foo
/somewhere/foo
cd mylink/../foo
foo
/tmp/here/foo
cd /tmp/mylink; mkdir ../foo; cd ../foo
/somewhere/else/foo
/tmp/foo
cd
..
foo/..
foo
mkdir
..
우리는 강력하지만 약간 피비린내 나는 버전에 이르렀습니다.
mkcd () {
case "$1" in
*/..|*/../) cd -- "$1";; # that doesn't make any sense unless the directory already exists
/*/../*) (cd "${1%/../*}/.." && mkdir -p "./${1##*/../}") && cd -- "$1";;
/*) mkdir -p "$1" && cd "$1";;
*/../*) (cd "./${1%/../*}/.." && mkdir -p "./${1##*/../}") && cd "./$1";;
../*) (cd .. && mkdir -p "${1#.}") && cd "$1";;
*) mkdir -p "./$1" && cd "./$1";;
esac
}
(연습: 첫 번째 호출에서 서브셸을 사용하는 이유는 무엇입니까 cd
?)
mkdir이 실패하면 현재 디렉터리가 변경되지 않았는지 확인하고 싶습니다. 쉘에 현재 디렉토리로 변경할 권한이 없으면 cd - 또는 $OLDPWD를 사용하여 다시 변경하는 것만으로는 충분하지 않습니다. 또한 cd를 호출하면 OLDPWD가 업데이트되므로 한 번만 수행하거나 OLDPWD를 복원하려고 합니다.
이전 줄의 단어를 다시 입력하지 않아도 되는 덜 기술적인 방법도 있습니다.
cd
then Esc .(또는 Alt+ ) 를 입력하여 .이전 명령의 마지막 인수를 삽입합니다.cd !$
cd
이전 명령의 마지막 인수에서 실행됩니다.- 를 눌러 Up이전 명령줄을 불러온 다음 편집하여
mkdir
로 변경합니다cd
.
하지만 참고하세요u+
해당 버전 이후 ksh93에서는 작동하지 않습니다., 93u+m/1.0.0-alpha+d1483150 2021-01-05에서 수정됨
답변3
Oh My Zsh를 사용하면 다음과 같은 명령어가 있습니다.가져가다그것이 바로 그것이 하는 일입니다. 이렇게 생겼습니다.
take myfolder
사실 저는 이것을 우연히 발견했습니다. 방금 봤는데 목록에 나와있어요이건 부정행위야Oh My Zsh GitHub 위키에서. 이것은 매우 유용한 명령이며 분명히 직접 생성하기 쉽습니다.
답변4
~에 따르면생산성을 향상시키기 위해 쉘 구성 파일에 어떤 사용자 정의를 적용했습니까?, 이것이 제가 하는 방법입니다:
# make a directory and cd to it
mcd()
{
test -d "$1" || mkdir "$1" && cd "$1"
}
이는 디렉토리가 이미 존재하는 경우에도 작동한다는 것을 의미합니다.