나는 많은 것을 반복하는 것을 발견했다.
mkdir longtitleproject
cd longtitleproject
디렉토리 이름을 반복하지 않고 한 줄로 수행하는 방법이 있습니까? 나는 여기 bash에 있습니다.
mkdir longtitleproject
thencd !^
나는 많은 것을 반복하는 것을 발견했다.
mkdir longtitleproject
cd longtitleproject
디렉토리 이름을 반복하지 않고 한 줄로 수행하는 방법이 있습니까? 나는 여기 bash에 있습니다.
mkdir longtitleproject
thencd !^
답변:
내장 명령은 없지만 mkdir
다음 을 호출하는 함수를 쉽게 작성할 수 있습니다 cd
.
mkcd () {
mkdir "$1"
cd "$1"
}
이 코드를 ~/.bashrc
파일 (또는 ~/.kshrc
ksh 사용자 또는 ~/.zshrc
zsh 사용자)에 넣으십시오 . 라는 함수를 정의합니다 mkcd
. "$1"
함수를 실행할 때 함수의 인수로 대체됩니다.
이 간단한 버전에는 몇 가지 결함이 있습니다.
-p
옵션을로 전달하십시오 mkdir
. (이 발견되지 않은가는 오타의 위험, 예를 들어이 증가 이것은 또는 바람직하지 않을 수있다 mkcd mydierctory/newsub
행복하게 만듭니다을 mydierctory
하고 mydierctory/newsub
생성을 의미 할 때 newsub
기존의 내부 mydirectory
.)-
그러나 다만 아니다 -
, 다음 mkdir
과 cd
옵션으로 해석합니다. 그냥 -
이면 cd
의미로 해석합니다 $OLDPWD
. +
그 뒤에 0 자리 이상의 숫자 가 오는 경우 cd
zsh에서는 디렉토리 스택의 인덱스로 해석합니다. --
인수 앞에 전달하여 첫 번째 문제는 해결할 수 있지만 다른 문제는 해결할 수 없습니다 . ./
상대 경로 인 경우 인수 앞에 추가 하여 이러한 모든 문제를 해결할 수 있습니다 .mkdir
을 따르지 CDPATH
않지만 cd
, 따라서 CDPATH
시작하지 않는 값으로 설정 한 경우 .
(어쩌면 다소 특이한 구성), cd
방금 만든 디렉토리와 다른 디렉토리로 이동할 수 있습니다. ./
상대 경로 앞에 추가하면이 문제 CDPATH
가 해결됩니다 ( 무시됩니다).mkdir
에 실패, 그것을 실행하려고합니다 cd
. 수정 : &&
두 명령을 분리하는 데 사용하십시오.여전히 매우 간단합니다.
mkcd () {
case "$1" in /*) :;; *) set -- "./$1";; esac
mkdir -p "$1" && cd "$1"
}
이 버전은 여전히 cd
한 가지 mkdir
경우에 방금 만든 디렉토리와 다른 디렉토리로 이동할 가능성 이 mkcd
있습니다 . 인수가 포함되어 ..
기호 링크를 통과하는 경우. 현재 디렉토리는 예를 들어, /tmp/here
및 mylink
심볼 링크에 /somewhere/else
, 다음 mkdir mylink/../foo
생성 /somewhere/else/foo
하는 반면 cd mylink/../foo
에 변화 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
한 다음 Esc .(또는 Alt+ .)를 입력하십시오.cd !$
실행 cd
이전 명령의 마지막 인수에.mkdir
로 cd
.ksh
되며 또한 작동합니다 zsh
) 순서입니다. 나는 그것을 자주 사용합니다.
mkcd() { mkdir -p "$1" && cd "$1"; }
(내 인스턴스) zsh에서 문제가되지 않는 것 같습니다. mkdir -p /var/tmp/somewhere/else /tmp/here; cd /tmp/here; ln -s /var/tmp/somewhere/else mylink; mkdir -p mylink/../foo && cd mylink/../foo; pwd
(설정 포함) 표시 /tmp/here/foo
되는 내용과 예상 한 내용을 표시합니다 . bash
오류가 발생하여로 변경되었습니다 /var/tmp/somewhere/foo
.
이것은 당신이 필요로하는 하나의 라이너입니다. 다른 구성이 필요하지 않습니다.
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)
mkdir foo && cd foo
합니다.
거의 매시간마다 다음을 입력하기 때문에이 동작을 스크립팅 한 적이 없었습니다 ...
$ mkdir someDirectory<ENTER>
$ cd !$
bash !$
는 마지막 줄의 마지막 단어를 친절하게 대체 합니다. 즉, 입력 한 긴 디렉토리 이름입니다.
또한 파일 이름 완성은 이러한 상황에서 친구입니다. 새 디렉토리가 폴더의 유일한 파일 인 경우 빠른 두 배 TAB는 새 디렉토리를 다시 입력하지 않고 제공합니다.
bash를 사용하면 다른 답변과 같이 일반적인 작업을 스크립팅 할 수 있다는 것이 멋지지만 다른 컴퓨터에서 작업 할 때 구문이 누락되지 않도록 bash가 제공하는 명령 줄 편집 기능을 배우는 것이 좋습니다. 사용자 정의 스크립트가 제공하는 설탕.
따라 하면 어떤 사용자는 생산성을 높이기 위해 쉘 프로파일 짓을 한거야? , 이것이 내가하는 방법입니다.
# make a directory and cd to it
mcd()
{
test -d "$1" || mkdir "$1" && cd "$1"
}
디렉토리가 이미 존재하는 경우에도 작동 함을 의미합니다.
-p
MKDIR에 대한 옵션은 오류가 표시되지 않습니다.
mcd
명령 은 무엇입니까 ? 어떤 패키지 또는 프로젝트가이 명령을 제공합니까?
Oh My Zsh를 사용하면 take 라는 명령 이 있습니다. 이런 식으로 보일 것입니다.
take myfolder
실제로 우연히 발견했습니다. 방금 보았는데 Oh My Zsh GitHub 위키 의이 속임수에 나와 있습니다. 그것은 매우 유용한 명령이며, 자신을 만들기가 매우 쉽습니다.
take
:) Perfect! btw-Oh My Zsh가 포함 된 iTerm2. 실제로 여기에는 3 가지 완벽한 답변이 있습니다. 이것은 @ jesús-carrera의 하나이며 선택한 답변입니다. 설정 및 환경 설정에 따라 다릅니다.
다음은 언급 할 가치가있는 약간의 변형입니다.
function mkdir() {
local dir=$1
command mkdir "$dir" && cd "$dir"
}
당신이 추가 ~/.bash_profile
하면 다음 사용할 수 있습니다 mkdir
(당신이 일단 정상적으로 source
지금은 기능 이상이 아닌 표준 실행을 제외하고, '그것을 D) mkdir
명령을 사용합니다.
이것은 Gilles 의 허용 된 답변에 따라 입력의 유효성을 검사하지는 않지만 내장을 (효과적으로) 재정의하는 방법을 보여줍니다.
문서에서 (약간 그림으로 표시) :
command mkdir [args]
이라는 쉘 함수mkdir
를args
무시하고 실행됩니다mkdir
. 쉘 내장 명령 또는 PATH 검색으로 찾은 명령 만 실행됩니다. 라는 이름의 쉘 기능이있는 경우ls
, 실행command ls
함수 내 것은 외부 명령을 실행하는 것ls
대신 재귀 함수를 호출
저는 믿습니다 builtin
비슷한 결과를 달성 command
.
$dir
command
대안으로 의 사용을 제시하고 있습니다 .
디렉토리를 만든 다음 CD를 작성하는 스크립트를 만든 다음 별칭을 지정했습니다. 그리고 여기 내가 설명하는 요점이 있습니다.
https://gist.github.com/rehnen/34236d6ff270ccaa74b6#mkdir-like-it-was-meant-to-be
위의 답변을 자동화하고 일회성 실행 스크립트를 만들었습니다.
fun='
mkcd ()
{
mkdir -p -- "$1" && cd -P -- "$1"
}'
echo "$fun" >> ~/.bashrc
이 파일을 새 파일에 복사 하고 터미널 by에서 한 번만mkcd.sh
실행하십시오 . 그런 다음 현재 세션에서 작동 하도록 실행 하십시오.bash mkcd.sh
source ~/.bashrc
그 후에 mkcd some_dir
는 해당 디렉토리에서 직접 작성하고 입력 할 수 있습니다 .
~/.bashrc
이미 답변이 제공됨)? 이 mkcd.sh
스크립트를 만드는 방법은 무엇입니까? 편집자와 함께? 이것은 단순히 편집하는 것보다 더 많은 일처럼 보입니다 ~/.bashrc
. 이것이 허용되는 답변보다 어떤 이점이 있습니까? …………………………………………… PS PS 인용 문제로 인해 실패 할 것입니다.
mcd
에서 unix.stackexchange.com/questions/6628/...