Почему псевдоним для стандартных команд не рекомендуется?

19

Например, общий псевдоним, который я видел в ~/.bashrcфайле (или его эквивалентах):

alias rm='rm -i'

Тем не менее, я видел, что люди рекомендуют против этого, потому что

  1. псевдоним может не существовать в другой системе, и поскольку вы стали небрежны rm, вы случайно удалили что-то важное. [1]
  2. используя этот псевдоним, вы фактически обучаетесь набирать текст yили yesпосле каждой rmкоманды, которая побеждает всю цель.

Есть ли другие причины, чтобы рекомендовать против этого? Могут ли некоторые программы просто делать вызовы rmвместо \rm, и наложение на них может вызвать проблемы для них?

Я использую rmпросто в качестве примера, но я видел и другие команды, такие как cpили mvпокрытые псевдонимами. Лично я медленно тренирую себя, чтобы использовать псевдоним, подобный этому, вместо rm -i:

alias trash=`mv -v -t $HOME/.Trash`
Рикардо Альтамирано
источник
3
Каждый раз, когда я отключаюсь по системе с псевдонимом по умолчанию rm -i, он обучает меня немного больше автоматически добавлять -fфлаг.
Jander
Вы можете псевдоним rm -iдля всего, что вы хотите. Такие , как del, irmи т.д. Вам не нужно , чтобы это псевдоним к rm. Это обходит пункт 1, и, выборочно используя delили в rmзависимости от того, что вы хотите, вы также в некоторой степени обходите пункт 2.
Мартин Турной

Ответы:

8

Предполагая, что вы используете bash, это не должно вызывать проблем для сценариев, поскольку неинтерактивные оболочки bash не являются источником ~/.bashrcили ~/.bash_profile(что, скорее всего, либо в том месте, где размещены ваши псевдонимы, либо в качестве первого шага для поиска ваших псевдонимов в другом сценарии) , Однако это может вызвать проблемы, если вы используете сценарии:

$ alias echo='command echo foo'
$ cat > script << 'EOF'
> #!/bin/bash
> echo bar
> EOF
$ chmod a+x script
$ ./script
bar
$ . ./script
foo bar

Ваш вопрос охватывает большую часть общей проблемы, связанной с наложением псевдонимов на существующие команды, основной из которых является то, что незнакомые среды, которые на первый взгляд кажутся одинаковыми, могут потенциально привести к совершенно разным результатам. Например, сглаживание rmна rm -iхорошие намерения, но плохо на практике по причинам , вы заявляете.

Крис Даун
источник
7

"Есть ли другие причины, чтобы рекомендовать против этого?"

Конечно:

(3) Потому что однажды я надеюсь добавить к основам, созданным [-----------], параноиков, которые наказывают других за наложение псевдонимов на стандартные команды, хотя наложение псевдонимов на стандартные команды, ну, в общем, стандартно ,

Если серьезно, это всего лишь предостережения. Если вы доверяете себе, чтобы не попасть в любую из этих ям гибели, тогда просто остерегайтесь и продолжайте.

Лично у меня псевдоним очень мало стандартных команд; Я использую небольшие вариации, потому что я немного параноик и сохраняю анал. Но одно хорошее применение, которое я нашел для этого, касается систем, где я часто вхожу в систему как root или другой пользователь, и есть некоторые вещи, которые я не хочу случайно / лениво запускать как root:

alias irc="echo \"No you don't!\""

или

alias irc="su irc_user"
лютик золотистый
источник
4

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

alias ls='rm'

Очевидно, это плохо, потому что однажды это вызовет неприятный сюрприз. Аналогично, замена стандартных команд псевдонимами в конечном итоге приведет к неприятному сюрпризу, когда вы меньше всего этого ожидаете.

Но позвольте мне представить общий сценарий, который случится почти с каждым администратором Unix по мере продвижения в их карьере:

Когда-нибудь в будущем вы начнете новую работу и будете работать над новой системой, созданной другими. В субботу будет три часа ночи, и вы не думаете прямо и склонны делать ошибки. Ваша стандартная среда не будет доступна. На самом деле, вы root.

Учитывая это, вы собираетесь помнить, что rmне псевдоним rm -i? Собираетесь ли вы проверять ваши специальные псевдонимы каждый раз, когда вы входите в окно? Если вы измените среду root, будут ли ваши коллеги довольны вашим изменением?

Я честно говоря об этом. В своей карьере я работал над тысячами систем, и если бы я действительно изменил среду на всех этих системах, трудно было бы увидеть ценность.

Псевдоним rmдля rm -iочень распространен, и я видел, что он предотвращает много проблем, но он также вызвал много неожиданностей и часов дополнительной работы по восстановлению случайно удаленных файлов.

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

# List long, with color or special characters, depending on OS
alias  ll='ls -l'
# Long, with metacharacters, show dotfiles, don't show . and ..
alias lll='ls -lA'
# Long, with metacharacters, show dotfiles, show . and ..
alias lla='ls -la'
# List just the dotfiles
alias  l.='ls -l -Ad .????*'

# Useful greps
#alias hgrep='history |grep ${*} |grep -v $$'
alias greph='history |grep ${*}'
alias grepp='ps -ef |grep ${*}'

### Highlight some text.
# From http://unix.stackexchange.com/questions/366/convince-grep-to-output-all-lines-not-just-those-with-matches/367#367
highlight () { grep --color -E "$1|$" $2 ; }

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

# For safety!
alias rm='rm -i'
Стефан Ласевский
источник
8
Запоминание флагов для lsможет быть более удобным, чем запоминание десяти псевдонимов.
Бернхард
Очень верно. И на самом деле я редко использую эти псевдонимы. Я не уверен, почему они все еще у меня есть, кроме более сложных псевдонимов (и функций), которые было трудно выяснить и которые пригодны для справки. Для простоты я, вероятно, должен удалить их.
Стефан Ласевский
«Иллюстрация» (первый пример) не очень полезна. Это явно вредоносно, и мы знаем, что заминирование системы может быть вредным. Ваш rm-> rm -iпример намного лучше. Другим хорошим ~/.trash
примером
1
@Bernhard: правда, но псевдонимы быстрее печатать. (Но десять слишком много, независимо от того.)
Эмануэль Берг
2
@StefanLasiewski: Подсказка: никогда не удаляйте вещи, которые не показаны, по чисто эстетическим причинам. Пусть они остаются, если они не мешают вам активно. Это такой быстрый процесс удаления материала после нескольких часов его настройки; и если вы когда-нибудь пожалеете об этом, вы почувствуете себя идиотом, что не просто позволили им быть.
Эмануэль Берг
4

Есть больше опасностей для этого.

Например, если вы используете shell-commandв Emacs, вы можете подумать, что получаете «свою» команду (или псевдоним , но вам не нужно lsмногократно использовать псевдоним в терминале, прежде чем вы забудете все о настройке псевдонима, подумав о это как любая другая команда ...) - фактически (обратно в Emacs) вы получаете (unaliased) команду. Emacs выполнит это без проблем, так что вы можете даже не замечать того, что только что произошло!

Что касается разных компьютеров и / или систем, если вы считаете слишком утомительным настраивать отдельные .rcфайлы для них всех, у вас может быть только один такой файл, но с ifпредложениями для адаптации.

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

if [[ `uname` == "SunOS" ]]; then
  unset -f mic cpkeep mcp mcph cpindex cpconf # not for Solaris
fi
Эмануэль Берг
источник
3

Переименование стандартных команд с помощью псевдонимов (т. rm=rm -iЕ.) Может определенно привести к тому, что псевдоним недоступен. Я предпочитаю не использовать такие, и (в несколько горьких, горький опыт ;-) Я стал acustomed читать каждую команду дважды, и если это rmили mvили что - нибудь еще потенциально разрушительными трижды. И такие псевдонимы приводят к автоматическому "rm foo" ENTER "y" Ой !! в любом случае (и каждый раз стоит дополнительное нажатие).

Но это только я. Если вы не планируете работать в чужой среде (на других машинах, других пользователях ...) и вы можете устанавливать свои любимые псевдонимы, где бы вы ни находились, просто сходите с ума. Известно, что Unix дает пользователям более чем достаточно веревки, чтобы стрелять в ноги.

vonbrand
источник
0

Другие ответы хороши, но все они смотрят только на то, как это влияет на вас.

Позвольте мне немного перевернуть ответ @Stephan Laswieski.

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

Затем, когда они что-то делают или говорят вам, это может работать не так, как ожидалось.

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

В худшем случае посмотрите на пример в одном из ответов: alias ls = 'rm -rf'.

Джо
источник