Сами двоичные файлы знают, какая версия общей библиотеки они зависят от и запрашивают это конкретно. Можно использовать 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 на это
Можно сделать это с функцией:
$ 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
когда Вы работаете с другими системными администраторами), может быть очень опасно заменить существующую команду, потому что среда отличается от того, что ожидают люди.
В ударе Вы не можете повториться к псевдонимам для действия, которые требуют параметра. Для этого существуют функции. Так вставляет Ваш ~/.bashrc
следующее
mycd() {
cd "$1"
ls
}
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
ведет себя в сценариях.
[ -z "$PS1" ]
проверки, если $PS
(интерактивная быстрая переменная), "нулевая длина" (-z). Если это - нулевая длина, это означает, что не было установлено, таким образом, Bash не должен работать в интерактивном режиме. && return
отделите выходы от определения источника .bashrc
в этой точке, при этих условиях.
– frabjous
21.01.2015, 19:42
i
в "$-"
: case "$-" in *i*) ;; *) return ;; esac
.
– Kusalananda♦
09.01.2017, 21:38
PS1
переменная может быть сброшена или пустая, и оболочка может все еще быть интерактивной (но без подсказки). Я проверил бы $-
удостоверяться.
– Kusalananda♦
30.09.2017, 22:24
вне темы, так как вопрос отмечен удар/, но поскольку некоторые вопросы закрываются как дубликат этого, которые не упоминают удар:
С zsh:
chpwd() ls
chpwd () функция вызвана zsh каждый раз, когда текущий каталог изменяется (посредством CD, pushd, popd...). tcsh имеет подобную функцию и, вероятно, где zsh получил его от.
Почему бы не добавить псевдоним к вашему файлу .bashrc?
Примерно так:
alias cdls='cd "$@" && ls'
Поместите приведенный ниже код в .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"
Еще удобнее - с возможностью вернуться в историю :
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
, поэтому вы увидите сообщение об ошибке при попытке перейти в неправильный каталог.
Обычное решение создания псевдонима для команды 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
Я думаю, что хорошо включить опции ls
таким образом, поскольку cd
не принимает никаких опций.
cdls() {
cd ${$#} && ls ${@:0:$#-1}
}
Вот что я считаю полезным (в 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
Скопируйте это:
altercd() {
cd() {
unset -f cd;
cd "$*" && ls;
altercd;
}
}; altercd
Теперь вы можете сделать простой компакт-диск:
cd /
(files listed)
cd /home
(files listed)
etc...
pwd
. Не уверенный, если это - лучшая практика, но она обычно делается. См. tldp.org/LDP/abs/html/aliases.html для некоторых примеров. – Stefan Lasiewski 09.09.2011, 22:05cd() { builtin cd "$@" && pwd; };
- использование стандартной оболочки Bourne на macOS (Горная цепь 10.12.6) – Swivel 30.09.2017, 22:10