Добавлять префикс ко всем командам в оболочке

Необходимо заменить

grep ^recentdirs > defaults.cfg

с

sexp="s[^recentdirs.*[recentdirs=(${newdir[@]} ${recentdirs[@]})["
sed -i -e "$sexp" defaults.cfg
21
04.12.2019, 20:52
8 ответов

Одним из решений может быть установка псевдонимов, но вы должны быть внимательны, когда они сталкиваются со встроенными командами и системными двоичными файлами (, напримерps).

В ~/.bashrcдобавьте несколько строк, например, (вступит в силу, когда вы в следующий раз запустите bash или наберетеsource ~/.bashrc):

alias commit='git commit'
alias docker='sudo docker'
alias images='docker images'
alias ps='docker ps'

Чтобы запустить настоящий ps, вам нужно будет ввести command psили \ps. Как правило, это влияет только на набор текста в командной строке, если вы специально не сделаете псевдонимы доступными для сценариев.

Что касается интерактивного интерфейса оболочки, как вы предлагаете, это потребует чего-то более сложного.

А именно, расширение @Jesse _Прекрасное предложение B:

use_prefix () {
    while read -p "$* >" -ra c; do
        [ "${c[0]}" = "exit" ] && break
        "$@" "${c[@]}"
    done
}

Включение ключевого слова exit, а также добавление подсказки, напоминающей вам о том, что вы делаете.

8
27.01.2020, 19:43

Привет и добро пожаловать на сайт.

один из возможных способов обойти это — использоватьaliasing

хотя это и не отменяет «префикс», но может значительно сэкономить время

напр.

alias g=git

$ g init
$ g add -A
$ g commit
$ g push

ИЛИ

если слов несколько, просто используйте кавычки

alias sd="sudo docker"

sd run my-repo/my-image
sd ps
sd images

однако вам нужно будет сбрасывать эти псевдонимы при каждом сеансе

4
27.01.2020, 19:43

Вы можете использовать функцию, подобную следующей:

use_prefix () {
    while read -ra c; do
        "$@" "${c[@]}"
    done
}

Это примет ваш префикс в качестве аргументов для команды use_prefix, а затем прочитает со стандартного ввода для каждой команды, к которой нужно добавить префикс.

Примечание. :Вам придется использовать Ctrl+C для выхода из цикла чтения while.

16
27.01.2020, 19:43

Вы можете использовать xargs, но с должным учетом предостережений , связанных с его использованием

xargs -L1 git

, затем введите init, add -Aи т. д., по одному в строке

13
27.01.2020, 19:43

С оболочкой zshможно было запустить:

zle-line-init() if [[ $CONTEXT = start ]] LBUFFER=$zle_prefix$LBUFFER
zle -N zle-line-init

Чтобы содержимое $zle_prefixвставлялось в начало буфера, когда вы начинаете вводить новую командную строку.

Так что можно:

zle_prefix='sudo docker '

Для того, чтобы sudo dockerвставлялось в начале последующих команд.

Вы можете определить другой виджет, который заполняет$zle_prefixтем, что в данный момент находится перед вашим курсором:

prime-zle-prefix() zle_prefix=$LBUFFER
zle -N prime-zle-prefix
bindkey '\eP' prime-zle-prefix

Затем вы можете ввести

$ sudo docker Alt+Shift+P ls

Затем для всех последующих команд будет вставлено sudo docker. Когда вы закончите, очистите строку(Ctrl+U)и снова введите Alt+Shift+P , чтобы очистить $zle_prefix.

10
27.01.2020, 19:43

Вы можете создать псевдоним в файле.bashrc Linux :псевдоним init="git init"

и когда вы запускаете команду init из терминала, автоматически вызывается команда «git init».

0
27.01.2020, 19:43

По сути, вам нужна универсальная -вспомогательная -оболочка для конкретной команды:

shell() {
    TOPCMD=$@ bash -c 'while read -p "${TOPCMD##*/}> " -ra sub; do
        case ${sub[0]:-} in
        "") continue;;
        exit) exit;;
        escape) (set -x; ${sub[@]:1});;
        *) (set -x; ${TOPCMD} ${sub[@]});;
        esac
        done'
}

Итак,:

$ shell git -p
git -p> init
+ git -p init
Initialized Git repository in /path/to/.git/
git -p> escape touch foo
+ touch foo
git -p> add.
+ git -p add.
git -p> status
+ git -p status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   foo

git -p> 

Любая введенная вами команда получает префикс исходной команды (абсолютной или относительной, а также любые аргументы ). Приглашение напомнит вам, в какой исходной команде вы находитесь. Вы можете exitвыйти полностью или escapeодну команду.

3
27.01.2020, 19:43

Предполагая, что вы используете bash, существует много способов сделать это, как указано выше. Вот что мне показалось наиболее удобным -YMMV:

  1. Создайте функцию для каждого «ярлыка», который вы хотите использовать.
  2. Разместите все такие функции в файле с именем, скажем,~/.bash_aliases
  3. Источник этого файла в вашем .bash_profile.
  4. Вызовите функцию, за которой следует аргумент (s ).

Обратите внимание, что, строго говоря, файл не содержит псевдонимов, но я использую это имя, чтобы ничего не загромождать. Возможно, вы захотите назвать это функциями.bash _.

Вот очень простой пример для начала. Он не проверяет, действительно ли вы передали аргумент или нет.

$ cat ~/.bash_aliases

g() {
 git "$@"
}

sudock() {
 sudo docker "$@"
}

Затем вы можете добавить строку в свой .bash_profile, чтобы получить его вот так:

. ~/.bash_aliases

Вот несколько примеров использования:

g status
g commit -m 'initial commit' fileName
sudock run my-repo/my-image

Обратите внимание, что вы можете использовать $1 вместо $@, но это будет принимать только один аргумент вместо того, чтобы учитывать все, что было передано функции.

ХТН.

0
27.01.2020, 19:43

Теги

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