Сделать CD автоматически Ls


47

Я нахожу, что я часто делаю следующее:

%> cd bla/bla
%> ls

Я хотел бы, чтобы всякий раз, когда я cdв каталог, он автоматически делал ls.

Некоторое время я возился с моим .bashrc, но не мог понять, как это сделать.

Ответы:


51

Вы можете сделать это с помощью функции:

$ cdls() { cd "$@" && ls; }

В &&означает « cdв директории, и в случае успеха (например , каталог существует), запуск ls». Использование &&оператора лучше, чем использование точки с запятой ;между двумя командами, как с { cd "$@" ; ls; }. Эта вторая команда будет выполняться lsнезависимо от того, cdсработало или нет. Если произошел cdсбой, lsбудет напечатано содержимое вашего текущего каталога, что будет сбивать с толку пользователя. В качестве лучшей практики используйте &&и нет ;.

$ cdls /var/log
CDIS.custom     fsck_hfs.log    monthly.out     system.log
$ pwd
/var/log

Как правило, плохая практика - переименовывать команду, которая уже существует, особенно для обычно называемой команды, такой как cd. Вместо этого создайте новую команду с другим именем. Если вы перезаписываете cdфункцию или псевдоним, который также называется cd, что произойдет, если вы введете каталог с 100 000 файлов? Есть много утилит, которые используют cd, и они могут запутаться из-за этого необычного поведения. Если вы используете общую учетную запись (например, rootкогда вы работаете с другими системными администраторами), замена существующей команды может быть очень опасной, поскольку среда отличается от ожидаемой.


Эта команда действительно изменить каталог? Со страницы руководства bash: «Механизм использования аргументов в тексте замены отсутствует. Если требуются аргументы, следует использовать функцию оболочки»
enzotib

@enzotib: Да, это действительно меняет каталог, по крайней мере, для меня. Я обновил свой ответ, чтобы показать вывод pwd. Не уверен, что это лучшая практика, но обычно это делается. См. Tldp.org/LDP/abs/html/aliases.html для некоторых примеров.
Стефан Ласевский

2
Во-первых: это не работает здесь. Второе: на этой странице они используют переменные, а не позиционные параметры. Третье: ABS является распространенным источником плохой практики.
энзотиб

1
Псевдоним работает для меня на Snow Leopard, но не на CentOS5 или CentOS6. Я обновил свой ответ, чтобы использовать только функцию. Нет псевдонимов.
Стефан Ласевский

1
Не работает для меня Попробовал @frabjous ответ, и он работает: cd() { builtin cd "$@" && pwd; };- с использованием стандартной оболочки Bourne на macOS (Sierra 10.12.6)
Swivel

39

У меня есть это в моем .bashrc, и он отлично работает.

function cd {
    builtin cd "$@" && ls -F
    }

Ранее в моем .bashrc я имел:, [ -z "$PS1" ] && returnи все после этой строки относится только к интерактивным сессиям, так что это не влияет на cdповедение скриптов.


1
Что именно делает [ -z "$PS1" ] && return?
синтагма

2
[ -z "$PS1" ]проверяет, является ли $PS(переменная интерактивного приглашения) «нулевой длиной» (-z). Если это нулевая длина, это означает, что он не был установлен, поэтому Bash не должен работать в интерактивном режиме. На этом этапе, в этих условиях, && returnдеталь выходит из источника .bashrc.
frabjous

1
Другой способ проверить интерактивность искать iв "$-": case "$-" in *i*) ;; *) return ;; esac.
Кусалананда

@Kusalananda & frabjous: Есть ли случаи, когда один должен использоваться вместо другого?
Поворотная

1
@Swivel PS1Переменная может быть неустановленной или пустой, а оболочка все еще может быть интерактивной (но без подсказки). Я бы проверил, $-чтобы убедиться.
Кусалананда

13

не по теме, так как вопрос помечен / bash, но поскольку некоторые вопросы закрыты как дубликат этого вопроса, в котором не упоминается bash:

С зш:

chpwd() ls

Функция chpwd () вызывается zsh при каждом изменении текущего каталога (посредством cd, pushd, popd ...). У tcsh есть похожая особенность, и, вероятно, откуда zsh его получил.


4

Почему бы не добавить псевдоним в ваш файл .bashrc?

Что-то вроде:

alias cdls='cd "$@" && ls'

@don_crissti Функция и псевдоним - это разные вещи. Так почему не?
Йодка Лемон

Это самый быстрый и чистый способ сделать то, о чем просил ОП. По моему мнению, функции должны использоваться для более сложных вещей, в то время как создание ярлыков для часто набираемых команд - именно то, для чего существуют псевдонимы.
Ghos3t

1
У меня странная проблема с этим псевдонимом, когда я использую его следующим образом, cdls projec2, он покажет все файлы в папке проекта 2, но на самом деле не перейдет в эту папку, вместо этого он останется в исходной папке.
Ghos3t

Да, использование псевдонима просто перечисляет содержимое в этом каталоге, но на самом деле туда не попадает.
a3y3

2

Общее решение создания псевдонима для команды cd не является идеальным, потому что есть другие команды, которые могут изменить ваш текущий каталог, например popd, или даже запустить скрипт с командой cd в нем.

Лучше использовать перехват $ PROMPT_COMMAND, который выполняет команду перед возвратом приглашения.

Команда (в нашем случае это функция) будет выполнять ls, только если каталог был изменен, чтобы уменьшить шум на экране. Код для .bashrc:

    #each console has its own file to save PWD
    PrevDir=$(tty) 
    PrevDir=/tmp/prev-dir${PrevDir////-}
    #don't ls when shell launched
    echo $PWD > $PrevDir
    LsAfterCd() {
        [[ "$(< $PrevDir)" == "$PWD" ]] && return 0

        ll --color=always | sed 1d

        echo $PWD > $PrevDir
    }
    PROMPT_COMMAND=LsAfterCd


1

В bash вы не можете использовать псевдонимы для действий, для которых требуется параметр. Для этого есть функции. Так что вставьте в ваш ~/.bashrcследующий

mycd() {
  cd "$1"
  ls
}


Чтобы разрешить параметр для команды ls, я использую функцию mycd {builtin cd $ 1 && ls $ 2}. Теперь вы можете вызывать команду, например, mycd .. -la
Christian Schulzendorff

@ChristianSchulzendorff: лучше использовать кавычки: function mycd { builtin cd "$1" && ls "$2" } .
Энзотиб

Не работает, я просто попробовал. Файл был пуст, но после добавления кода ничего не изменилось.
Чёрный

0

Поместите приведенный ниже код в .profile, и он работает. Протестировано на HP-Unix box.

cdl()
{
if [ "$#" = 0 ]; then
cd ~ && ls -ltr
elif [ -d "$@" ]; then
cd "$@" && ls -ltr
else
echo "$@" directory not found!!!
fi
}

#SET YOUR ALIAS TO CD
alias cd="cdl"

0

Еще удобнее - с возможностью вернуться в историю :

function cd() {
    if [ -d "$@" ]; then
        echo -n "Stack: "
        pushd "$@"
        ls
    else
        builtin cd "$@"
    fi
}
function popd() {
    builtin popd "$@" && ls
}

Когда вы меняете каталог, Stack: (current_dir) (previous_dir) ...будет показана строка с:, затем lsвывод. Чтобы вернуться в истории директорий просто попы этой команды: popd.

Я добавил, elseчтобы вы увидели ошибку при попытке перейти в неправильный каталог.


если вы просто сделаете компакт-диск - это приведет вас к вашему последнему
Ян

0

Я думаю, что это хорошо, чтобы включить lsпараметры таким образом, поскольку не cdпринимает никаких вариантов.

cdls() {
  cd ${$#} && ls ${@:0:$#-1}
}

Хм ... cdдействительно принимает варианты.
Кусалананда

0

Вот что я считаю полезным (в Debian 9):

c() {
    cd "${@}" \
    && ls --color=always -C \
    | sed '
        # on line 5, print the line,
        5 {
            # append an ellipsis
            a[...]
            # and quit
            q
        }
        # print lines 1-4 verbatim
    '
}

Это дает мне усеченный вывод с многоточием на случай, если в этом каталоге слишком много элементов, поэтому консоль остается чистой:

$ c data/git/buildroot/package/
4th                              lua-markdown
a10disp                          lua-messagepack
acl                              lua-msgpack-native
acpica                           luaossl
acpid                            lua-periphery
[...]
$ ls -1 | wc --lines
1977

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.