Необходимо заменить
grep ^recentdirs > defaults.cfg
с
sexp="s[^recentdirs.*[recentdirs=(${newdir[@]} ${recentdirs[@]})["
sed -i -e "$sexp" defaults.cfg
Одним из решений может быть установка псевдонимов, но вы должны быть внимательны, когда они сталкиваются со встроенными командами и системными двоичными файлами (, например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
, а также добавление подсказки, напоминающей вам о том, что вы делаете.
Привет и добро пожаловать на сайт.
один из возможных способов обойти это — использовать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
однако вам нужно будет сбрасывать эти псевдонимы при каждом сеансе
Вы можете использовать функцию, подобную следующей:
use_prefix () {
while read -ra c; do
"$@" "${c[@]}"
done
}
Это примет ваш префикс в качестве аргументов для команды use_prefix
, а затем прочитает со стандартного ввода для каждой команды, к которой нужно добавить префикс.
Примечание. :Вам придется использовать Ctrl+C для выхода из цикла чтения while.
Вы можете использовать xargs
, но с должным учетом предостережений , связанных с его использованием
xargs -L1 git
, затем введите init
, add -A
и т. д., по одному в строке
С оболочкой 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
.
Вы можете создать псевдоним в файле.bashrc Linux :псевдоним init="git init"
и когда вы запускаете команду init из терминала, автоматически вызывается команда «git init».
По сути, вам нужна универсальная -вспомогательная -оболочка для конкретной команды:
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
одну команду.
Предполагая, что вы используете bash, существует много способов сделать это, как указано выше. Вот что мне показалось наиболее удобным -YMMV:
~/.bash_aliases
.bash_profile
. Обратите внимание, что, строго говоря, файл не содержит псевдонимов, но я использую это имя, чтобы ничего не загромождать. Возможно, вы захотите назвать это функциями.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 вместо $@, но это будет принимать только один аргумент вместо того, чтобы учитывать все, что было передано функции.
ХТН.