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 ~/.bashrcpowinieneś móc to zrobić:
hello@world:~$ cs Documents/
example.pdf tunafish.odt
hello@world:~/Documents$
Możesz użyć builtinpolecenia w bash:
function cd() {
new_directory="$*";
if [ $# -eq 0 ]; then
new_directory=${HOME};
fi;
builtin cd "${new_directory}" && ls
}
function ls() { /usr/bin/ls $* }
cdponieważ zmieniłem także rvmmoją cddefinicję. 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ć csjako nazwy, ponieważ csw 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.
$1cudzysł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 cdstosując $@zamiast "$1"jako takie: cs() { cd $@ && ls; }.
Miałem problemy z przedefiniowaniem, cdponieważ zmieniłem także rvmmoją cddefinicję. Zobacz https://stackoverflow.com/a/19941991/1601989 . Tak naprawdę nie chciałem używać, builtinponieważ pomijałoby rvmto, 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 rmvwierszu w .bashrc:
alias cd='cdd'
# Use bash built in completion for cd to allow for filenames to be used
complete -r cd