Как вызвать оболочку, встроенную явно?

Другая опция состояла бы в том, чтобы включить цвета и использование 'меньше-r' как Ваш пейджер.

git config --global color.ui true
git config --global core.pager 'less -r'

Это приводит к

[color]
    ui = true
[core]
    pager = less -r

в Вашем ~/.gitconfig

Для получения дополнительной информации посмотрите Pro книга Мерзавца.

13
19.02.2018, 03:56
4 ответа

command встроенные силы название команды, которое будет интерпретироваться как встроенная или внешняя команда (пропускающий псевдоним и функциональный поиск). Это доступно во всех оболочках POSIX включая удар.

cd () { command cd "$@" && pushd "$@"; }

(Обратите внимание, что этим примером является плохой: это не работает с относительными путями, и Вы могли бы также просто ввести pushd во-первых.)

В ударе и zsh (но не ksh), можно использовать builtin вынудить название команды интерпретироваться как встроенное, исключая псевдонимы, функции и внешние команды.

5
27.01.2020, 19:53

Bash имеет (встроенную) команду builtin, который делает точно, в чем Вы нуждаетесь. Замена cd с builtin cd в Вашей функции зафиксирует рекурсию.

16
27.01.2020, 19:53

Чтобы это работало с относительными путями, потребуется следующее:

function cd { 
   dir="$(realpath "$@")"
   command cd "$dir"
   pushd "$dir"
}

Предполагается, что вы используете достаточно современный дистрибутив Linux, который содержит утилиту 'realpath'. (RHEL 6, например, не поддерживает ). Если доступен Perl, 'realpath' можно смоделировать, используя:

! realpath $(pwd) > /dev/null 2>&1  && function realpath {
    perl -e "use Cwd realpath; print realpath(\"$1\"). \"\\n\";"
}
-1
27.01.2020, 19:53

Я подозреваю, что когда вы говорите, что «не хотите переименовывать свою функцию во что-либо другое», вы имеете в виду, что хотите иметь возможность вызывать свою функцию под тем же именем, что и исходная команда.

Таким образом, еще один способ сделать это, который также работает для вещей, которые не встроены -в ins, состоит в том, чтобы назвать вашу функцию как-то иначе, а затем определить псевдоним для обернутой команды. Это работает, потому что псевдоним не существует в контексте выполнения вашей функции.

Пример файла wrapper.sh:

#!/bin/bash
function my_wrapper() { wrapped_program $@ && dostuff }

И в, например,.bash _псевдонимах:

source /path/to/wrapper.sh
alias wrapped_program="my_wrapper"

Но это довольно банально. Использование commandпредпочтительнее, когда это возможно.

1
27.01.2020, 19:53

Теги

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