Odpowiedzi:
Z porad i wskazówek Bash: „cd” ze stylem :
Na koniec chcę pokazać, jak napisać własny niestandardowy zamiennik dla polecenia „cd”.
Czy po przejściu do katalogu zawsze piszesz to samo? Prawdopodobnie przynajmniej za każdym razem wyświetlasz listę plików, być może do tego stopnia, że twoje ręce automatycznie wpisują „ls” po każdym „cd”.
Cóż, próbując wszystkich sposobów, jakie mogłem wymyślić, okazuje się, że jest tylko jeden sposób, aby właściwie osiągnąć cel, którego szukamy. Musimy stworzyć funkcję powłoki.
Funkcje powłoki są częścią programowania powłoki. Podobnie jak w skompilowanych językach programowania funkcje zapewniają rodzaj modułowej modularyzacji. Można stworzyć ogólną funkcję do wykonywania często używanego bitu logiki lub obliczeń z różnymi parametrami. W tym przypadku parametrem jest bieżący katalog roboczy.
Oto prosty:
function cs () { cd $1 ls }
Jak słusznie zauważa @geirha, powyższa funkcja zawiedzie, jeśli spróbujesz przełączyć się do katalogu ze spacją w nazwie:
$ cs A\ B/
-bash: cd: A: No such file or directory
<current directory listing>
Zamiast tego należy użyć następującej funkcji:
function cs () {
cd "$@" && ls
}
Po dodaniu tego kodu do swojego kodu ~/.bashrc
powinieneś móc to zrobić:
hello@world:~$ cs Documents/
example.pdf tunafish.odt
hello@world:~/Documents$
Możesz użyć builtin
polecenia w bash:
function cd() {
new_directory="$*";
if [ $# -eq 0 ]; then
new_directory=${HOME};
fi;
builtin cd "${new_directory}" && ls
}
function ls() { /usr/bin/ls $* }
cd
ponieważ zmieniłem także rvm
moją cd
definicję. Zobacz stackoverflow.com/a/19941991/1601989
Użyj funkcji zamiast aliasu:
cs() { cd "$1" && ls; }
Dzięki Florian Diesch za wskazówkę dotyczącą korzystania z funkcji. Nie mogę użyć cs
jako nazwy, ponieważ cs
w pakiecie csound znajduje się polecenie , więc użyłem go lc
.
Dodałem to do ~/.bash_aliases
( nano ~/.bash_aliases
):
function lc () {
cd $1;
ls
}
Aby to zadziałało, musi być terminal reset
.
$1
cudzysłowu spowoduje, że nie powiedzie się, jeśli katalog zawiera spacje. Ponadto powinieneś sprawdzić wartość zwracaną cd
; jeśli się nie powiedzie (np. odmowa dostępu), nie ma sensu uruchamiać ls
. lc() { cd "$@" && ls; }
Jako rozszerzenie do tej funkcji: cs() { cd "$1" && ls; }
może chcesz przekazać wszystkich argumentów funkcja do cd
stosując $@
zamiast "$1"
jako takie: cs() { cd $@ && ls; }
.
Miałem problemy z przedefiniowaniem, cd
ponieważ zmieniłem także rvm
moją cd
definicję. Zobacz https://stackoverflow.com/a/19941991/1601989 . Tak naprawdę nie chciałem używać, builtin
ponieważ pomijałoby rvm
to, co robi.
Dodałem następujące do mojego .bashrc
:
# cdd allows you to cd to the directory of the given file or directory
function cdd()
{
if [[ $# -eq 0 ]]; then
cd
elif [[ -d "$*" ]]; then
cd "$*"
elif [[ -f "$*" ]]; then
echo "WARNING: file given, cd to file's dirname" 1>&2
local dir=$(dirname "$*")
cd "$dir"
else
cd "$*"
fi
}
function cs()
{
cdd $* && ls
}
A potem po rmv
wierszu w .bashrc
:
alias cd='cdd'
# Use bash built in completion for cd to allow for filenames to be used
complete -r cd