Tôi thấy mình lặp đi lặp lại rất nhiều:
mkdir longtitleproject
cd longtitleproject
Có cách nào để làm điều đó trong một dòng mà không lặp lại tên thư mục? Tôi đang ở đây
mkdir longtitleproject
sau đócd !^
Tôi thấy mình lặp đi lặp lại rất nhiều:
mkdir longtitleproject
cd longtitleproject
Có cách nào để làm điều đó trong một dòng mà không lặp lại tên thư mục? Tôi đang ở đây
mkdir longtitleproject
sau đócd !^
Câu trả lời:
Không có lệnh tích hợp, nhưng bạn có thể dễ dàng viết một hàm gọi mkdir
sau đó cd
:
mkcd () {
mkdir "$1"
cd "$1"
}
Đặt mã này vào ~/.bashrc
tệp của bạn (hoặc ~/.kshrc
cho người dùng ksh hoặc ~/.zshrc
cho người dùng zsh). Nó định nghĩa một hàm gọi là mkcd
. "$1"
sẽ được thay thế bằng đối số của hàm khi bạn chạy nó.
Phiên bản đơn giản này có một số khuyết điểm:
-p
tùy chọn sang mkdir
. (Điều này có thể hoặc không thể mong muốn, vì nó làm tăng nguy cơ lỗi đánh máy không bị phát hiện, ví dụ như mkcd mydierctory/newsub
sẽ vui vẻ tạo mydierctory
và mydierctory/newsub
khi bạn định tạo newsub
bên trong hiện tại mydirectory
.)-
nhưng không chỉ -
, thì mkdir
và cd
sẽ diễn giải nó như một tùy chọn. Nếu nó chỉ -
, sau đó cd
sẽ giải thích nó có nghĩa $OLDPWD
. Nếu nó được +
theo sau bởi 0 hoặc nhiều chữ số, thì cd
trong zsh sẽ hiểu nó là một chỉ mục trong ngăn xếp thư mục. Bạn có thể khắc phục vấn đề đầu tiên, nhưng không phải là hai vấn đề khác, bằng cách vượt qua --
trước đối số. Bạn có thể khắc phục tất cả các vấn đề này bằng cách thêm vào ./
đối số nếu đó là đường dẫn tương đối.mkdir
không tuân theo CDPATH
, nhưng cd
thực tế, vì vậy nếu bạn đã đặt CDPATH
thành một giá trị không bắt đầu bằng .
(một cấu hình hơi khác thường được thừa nhận), thì cd
có thể đưa bạn đến một thư mục khác với thư mục vừa tạo. Chuẩn bị ./
cho các đường dẫn tương đối sửa lỗi này (nó gây ra CDPATH
bị bỏ qua).mkdir
thất bại, nó cố gắng thực hiện cd
. Khắc phục: sử dụng &&
để tách hai lệnh.Vẫn khá đơn giản:
mkcd () {
case "$1" in /*) :;; *) set -- "./$1";; esac
mkdir -p "$1" && cd "$1"
}
Phiên bản này vẫn có khả năng cd
đi vào một thư mục khác với thư mục mkdir
vừa tạo trong một trường hợp cạnh: nếu đối số mkcd
chứa ..
và đi qua một liên kết tượng trưng. Ví dụ: nếu thư mục hiện tại là /tmp/here
và mylink
là một liên kết tượng trưng đến /somewhere/else
, sau đó mkdir mylink/../foo
tạo /somewhere/else/foo
trong khi cd mylink/../foo
thay đổi thành foo
. Không đủ để tìm kiếm các liên kết tượng trưng trong đối số, vì trình bao cũng theo dõi các liên kết tượng trưng trong thư mục hiện tại của chính nó, vì vậy cd /tmp/mylink; mkdir ../foo; cd ../foo
không thay đổi thành thư mục mới ( /somewhere/else/foo
) mà vào /tmp/foo
. Cách khắc phục cho vấn đề này là để cho phần cd
dựng sẵn giải quyết tất cả các ..
thành phần đường dẫn trước (nó không có ý nghĩa để sử dụng foo/..
nếufoo
không tồn tại, vì vậy mkdir
không bao giờ cần phải xem bất kỳ ..
).
Chúng tôi đến với phiên bản mạnh mẽ này nếu hơi gory:
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
}
(Bài tập: tại sao tôi lại sử dụng một mạng con cho cd
cuộc gọi đầu tiên ?)
Nếu mkdir thất bại, tôi muốn chắc chắn không thay đổi thư mục hiện tại. Thay đổi trở lại với cd - hoặc $ OLDPWD không đủ tốt nếu shell không có quyền thay đổi vào thư mục hiện tại của nó. Ngoài ra, gọi cd cập nhật OLDPWD, vì vậy chúng tôi chỉ muốn thực hiện một lần (hoặc khôi phục OLDPWD).
Cũng có những cách ít chuyên biệt hơn để không phải gõ lại từ từ dòng trước:
cd
, sau đó Esc .(hoặc Alt+ .) để chèn đối số cuối cùng từ lệnh trước đó.cd !$
thực hiện cd
trên đối số cuối cùng của lệnh trước đó.mkdir
thành cd
.ksh
, và cũng hoạt động theo zsh
) cho "lặp lại từ cuối của lệnh trước". Tôi sử dụng nó khá thường xuyên.
/a/b/..//
thực sự sẽ làm việc nhưng không /a/b/../c
. Đã sửa. Tôi đã đặt câu hỏi cho đối tượng rộng hơn.
mkcd() { mkdir -p "$1" && cd "$1"; }
dường như không phải là một vấn đề trong (ví dụ của tôi) 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
(bao gồm thiết lập và) hiển thị /tmp/here/foo
đó là những gì đã được tạo (và những gì tôi mong đợi). bash
tạo sai và thay đổi thành /var/tmp/somewhere/foo
.
Đây là một lớp lót mà bạn cần. Không cần cấu hình khác:
mkdir longtitleproject && cd $_
Các $_
biến, trong bash, là lập luận cuối cùng trao cho các lệnh trước đó. Trong trường hợp này, tên của thư mục bạn vừa tạo. Như đã giải thích trong 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.
Sử dụng cd $_
để truy xuất đối số cuối cùng của lệnh trước thay cd !$
vì vì cd !$
đưa ra đối số cuối cùng của lệnh trước đó trong lịch sử shell :
cd ~/
mkdir folder && cd !$
bạn kết thúc nhà (hoặc ~ /)
cd ~/
mkdir newfolder && cd $_
bạn kết thúc ở newfolder dưới nhà !! (hoặc ~ / newfolder)
mkdir foo && cd foo
, không tiện dụng.
Nó sẽ không bao giờ xảy ra với tôi để kịch bản hành vi này bởi vì tôi nhập vào sau đây trên cơ sở gần một giờ ...
$ mkdir someDirectory<ENTER>
$ cd !$
trong đó bash vui lòng thay thế !$
bằng từ cuối cùng của dòng cuối cùng; tức là tên thư mục dài mà bạn đã nhập.
Ngoài ra, hoàn thành tên tệp là bạn của bạn trong những tình huống như vậy. Nếu thư mục mới của bạn là tệp duy nhất trong thư mục, một bản sao nhanh TABsẽ cung cấp cho bạn thư mục mới mà không cần nhập lại.
Mặc dù thật tuyệt khi bash cho phép bạn tạo ra các tác vụ phổ biến như các câu trả lời khác cho thấy tôi nghĩ tốt hơn là nên tìm hiểu các tính năng chỉnh sửa dòng lệnh mà bash phải cung cấp để khi bạn làm việc trên một máy khác, bạn không bị thiếu cú pháp đường mà tập lệnh tùy chỉnh của bạn cung cấp.
Theo những tùy chỉnh nào bạn đã thực hiện trên hồ sơ shell của mình để tăng năng suất? , đây là cách tôi làm điều đó:
# make a directory and cd to it
mcd()
{
test -d "$1" || mkdir "$1" && cd "$1"
}
nó có nghĩa là nó cũng hoạt động nếu thư mục đã tồn tại.
-p
tùy chọn để mkdir sẽ ngăn chặn lỗi.
mcd
Lệnh hiện có là gì? Gói hoặc dự án nào cung cấp lệnh này?
Nếu bạn sử dụng Oh My Zsh, có một lệnh được gọi là thực hiện chính xác điều này. Nó sẽ trông giống như thế này.
take myfolder
Tôi thực sự tìm thấy cái này một cách tình cờ. Tôi chỉ nhìn và nó được liệt kê trên chiếc áo này từ wiki Oh My Zsh GitHub. Đó là một lệnh khá hữu ích và dường như rất dễ dàng để tạo ra chính mình.
take
:) Hoàn hảo! btw - iTerm2 với Oh My Zsh. Thực tế có 3 câu trả lời hoàn hảo ở đây. Cái này, cái của @ jesús-carrera, và câu trả lời được chọn. Phụ thuộc vào thiết lập và sở thích của bạn.
Đây là một biến thể nhỏ đáng được đề cập:
function mkdir() {
local dir=$1
command mkdir "$dir" && cd "$dir"
}
Thêm phần này vào của bạn ~/.bash_profile
và sau đó bạn có thể sử dụng mkdir
như bình thường (một khi bạn đã sử dụng source
nó), ngoại trừ bây giờ nó sẽ chạy chức năng trên chứ không phải là mkdir
lệnh tiêu chuẩn .
Lưu ý, điều này không xác thực đầu vào theo câu trả lời được chấp nhận bởi Gilles , nhưng chứng minh làm thế nào bạn có thể (hiệu quả) ghi đè các nội dung.
Từ các tài liệu (diễn giải nhẹ):
command mkdir [args]
chạymkdir
vớiargs
bỏ qua bất kỳ chức năng shell có tênmkdir
. Chỉ các lệnh dựng sẵn shell hoặc các lệnh được tìm thấy bằng cách tìm kiếm PATH được thực thi. Nếu có một hàm shell được đặt tênls
, chạycommand ls
trong hàm sẽ thực thi lệnh bên ngoàils
thay vì gọi hàm đệ quy
Tôi tin rằng builtin
đạt được một kết quả tương tự command
.
$dir
command
như là một thay thế.
Tạo mkcd
lệnh cho môi trường của bạn trong một dòng
echo -e 'mkcd() {\n mkdir -p "$1" && cd $_\n}' >> ~/.${0//-/}rc && . ~/.${0//-/}rc
Tôi đã tạo một kịch bản tạo thư mục và sau đó cd vào nó, sau đó tôi đã đặt cho nó một bí danh. Và đây là một ý chính nơi tôi mô tả nó.
https://gist.github.com/rehnen/34236d6ff270ccaa74b6#mkdir-like-it-was-meant-to-be
Chỉ cần tự động hóa các câu trả lời ở trên và tạo một tập lệnh thực thi một lần:
fun='
mkcd ()
{
mkdir -p -- "$1" && cd -P -- "$1"
}'
echo "$fun" >> ~/.bashrc
Chỉ cần sao chép tệp này trong một tệp mới mkcd.sh
và chỉ chạy một lần trong thiết bị đầu cuối bash mkcd.sh
. Sau đó thực hiện source ~/.bashrc
để làm cho nó hoạt động trong phiên hiện tại.
Sau này, bạn có thể sử dụng mkcd some_dir
để tạo và nhập trực tiếp vào thư mục đó.
~/.bashrc
tệp đó (với một câu trả lời đã được đưa ra)? Và làm thế nào để bạn đề nghị tạo ra mkcd.sh
kịch bản này ? Với một biên tập viên, có lẽ? Điều này có vẻ như nhiều công việc hơn là chỉ chỉnh sửa ~/.bashrc
. Điều này có lợi thế gì so với câu trả lời được chấp nhận? Mạnh mẽ và đáng tin cậy. Tất cả đều như vậy, vì nó sẽ thất bại vì trích dẫn các vấn đề, điều này cho tôi biết rằng bạn thậm chí không thử nó.
mcd
từ unix.stackexchange.com/questions/6628/ấc