Сделайте CD автоматически ls

Сами двоичные файлы знают, какая версия общей библиотеки они зависят от и запрашивают это конкретно. Можно использовать ldd показать зависимости; мой для ls :

$ ldd /bin/ls
    linux-gate.so.1 =>  (0xb784e000)
    librt.so.1 => /lib/librt.so.1 (0xb782c000)
    libacl.so.1 => /lib/libacl.so.1 (0xb7824000)
    libc.so.6 => /lib/libc.so.6 (0xb76dc000)
    libpthread.so.0 => /lib/libpthread.so.0 (0xb76c3000)
    /lib/ld-linux.so.2 (0xb784f000)
    libattr.so.1 => /lib/libattr.so.1 (0xb76bd000)

Как Вы видите, это указывает на, например. libpthread.so.0, не просто libpthread.so.


Причина символьной ссылки для компоновщика. Когда Вы хотите связаться против libpthread.so непосредственно, Вы даете gcc флаг -lpthread, и это прибавляет lib префикс и .so снабдите суффиксом автоматически. Вы не можете сказать этому прибавлять .so.0 суффикс, таким образом, символьная ссылка указывает на новейшую версию lib к faciliate на это

48
08.05.2013, 11:30
12 ответов

Можно сделать это с функцией:

$ 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 когда Вы работаете с другими системными администраторами), может быть очень опасно заменить существующую команду, потому что среда отличается от того, что ожидают люди.

52
27.01.2020, 19:34
  • 1
    Та команда действительно изменяет каталог? Из страницы справочника удара: "Нет никакого механизма для использования аргументов в тексте замены. Если аргументы необходимы, функция оболочки должна использоваться" –  enzotib 09.09.2011, 21:58
  • 2
    @enzotib: Да, это действительно изменяет каталог, по крайней мере, для меня. Я обновил свой ответ для проявления вывода pwd. Не уверенный, если это - лучшая практика, но она обычно делается. См. tldp.org/LDP/abs/html/aliases.html для некоторых примеров. –  Stefan Lasiewski 09.09.2011, 22:05
  • 3
    Сначала: это не работает здесь. Во-вторых: на той странице они используют переменные, не позиционные параметры. В-третьих: ABS является общим источником плохих методов. –  enzotib 09.09.2011, 22:07
  • 4
    Псевдоним работает на меня на Snow Leopard, но не на CentOS5 или CentOS6. Я обновил свой ответ для использования функции только. Никакие псевдонимы. –  Stefan Lasiewski 10.09.2011, 03:37
  • 5
    не работает на меня. Попробованный ответ @frabjous и это работают: cd() { builtin cd "$@" && pwd; }; - использование стандартной оболочки Bourne на macOS (Горная цепь 10.12.6) –  Swivel 30.09.2017, 22:10

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

mycd() {
  cd "$1"
  ls
}
1
27.01.2020, 19:34
  • 1
  • 2
    Для разрешения параметра для команды ls я использую функцию mycd {встроенный CD 1$ && ls 2$}. Теперь можно назвать команду, например, mycd.. спасибо - la –  Christian Schulzendorff 19.02.2016, 11:20
  • 3
    @ChristianSchulzendorff: лучше использовать кавычки: function mycd { builtin cd "$1" && ls "$2" } . положительная сторона –  enzotib 19.02.2016, 18:58

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

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

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

40
27.01.2020, 19:34
  • 1
    Что точно делает [ -z "$PS1" ] && return ? –  syntagma 21.01.2015, 16:34
  • 2
    [ -z "$PS1" ] проверки, если $PS (интерактивная быстрая переменная), "нулевая длина" (-z). Если это - нулевая длина, это означает, что не было установлено, таким образом, Bash не должен работать в интерактивном режиме. && return отделите выходы от определения источника .bashrc в этой точке, при этих условиях. –  frabjous 21.01.2015, 19:42
  • 3
    Другой способ проверить на интерактивность состоит в том, чтобы искать i в "$-": case "$-" in *i*) ;; *) return ;; esac. –  Kusalananda♦ 09.01.2017, 21:38
  • 4
    @Kusalananda и замечательный: Есть ли случаи, где нужно использоваться вместо другого? –  Swivel 30.09.2017, 22:14
  • 5
    @Swivel фрагмента PS1 переменная может быть сброшена или пустая, и оболочка может все еще быть интерактивной (но без подсказки). Я проверил бы $- удостоверяться. –  Kusalananda♦ 30.09.2017, 22:24

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

С zsh:

chpwd() ls

chpwd () функция вызвана zsh каждый раз, когда текущий каталог изменяется (посредством CD, pushd, popd...). tcsh имеет подобную функцию и, вероятно, где zsh получил его от.

14
27.01.2020, 19:34

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

Примерно так:

alias cdls='cd "$@" && ls'
4
27.01.2020, 19:34
alias cd='builtin cd $1 && ls -l && builtin cd $1'
-1
27.01.2020, 19:34

Поместите приведенный ниже код в .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
27.01.2020, 19:34

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

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

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

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

0
27.01.2020, 19:34

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

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

Команда (в нашем случае функция) выполнит 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
2
27.01.2020, 19:34

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

cdls() {
  cd ${$#} && ls ${@:0:$#-1}
}
0
27.01.2020, 19:34

Вот что я считаю полезным (в 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
0
27.01.2020, 19:34

Скопируйте это:

altercd() {
    cd() {
        unset -f cd;
        cd "$*" && ls;
        altercd;
    }
}; altercd

Теперь вы можете сделать простой компакт-диск:

cd / 
(files listed)
cd /home 
(files listed)
etc... 
2
27.01.2020, 19:34

Теги

Похожие вопросы