Чому зведення стандартних команд не рекомендується?


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прапор.
Джандер

Ви можете rm -iнадавати псевдонім на все, що завгодно. Такі як del, irmтощо. Вам не потрібно це називати rm. Це обходить точку 1, і вибірково використовуючи delабо rmзалежно від того, що ви хочете, ви також обходите точку 2 певною мірою.
Martin Tournoij

Відповіді:


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, коли вони просуваються у своїй кар'єрі:

Колись у майбутньому ви розпочнете нову роботу і будете працювати над новою системою, яку створили інші. У суботу буде три години ранку, і ви не думаєте прямо і схильні робити помилки. Ваша стандартна середовище буде недоступною. Насправді ви корінь.

З огляду на це, чи пам’ятаєте ви, що rmце не чуже rm -i? Чи збираєтесь ви перевіряти свої спеціальні псевдоніми щоразу, коли ви входите в поле? Якщо ви зміните середовище root, чи будуть ваші колеги задоволені вашими змінами?

Я чесно на паркані з цього приводу. Я працював над тисячами систем у своїй кар’єрі, і якби я змінив середовище для всіх цих систем, було б важко побачити значення.

Aliasing 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приклад набагато кращий. Ще одним хорошим буде те, що псевдоніми Rm поміщають речі~/.trash
derobert

1
@Bernhard: Щоправда, але псевдоніми швидше набирати текст. (Але десяток занадто багато незалежно.)
Емануель Берг

2
@StefanLasiewski: Підказка: ніколи не видаляйте речі, які не відображаються, з чисто естетичних причин. Нехай вони залишаються, якщо вони вас не турбують активно. Це такий швидкий акт, що видаляє речі, витрачаючи години на його налаштування; і якщо ти коли-небудь пошкодуєш про це, ти відчуваєш себе ідіоткою за те, що не просто пустив їх.
Емануель Берг

4

Тут небезпеки більше.

Наприклад, якщо ви використовуєте shell-commandв Emacs, ви можете подумати, що отримаєте команду "свого" (або псевдонім , але вам не доведеться вдаряти lsпсевдонім у терміналі, який багато разів, перш ніж ви забудете все про налаштування псевдоніма, думаючи про це як будь-яка інша команда ...) - адже (назад до Emacs), ви отримуєте команду (недозволену). 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 дає користувачам більше, ніж достатню кількість мотузок, щоб стріляти своїми ногами.


0

Інші відповіді хороші, але всі вони лише дивляться, як це на вас впливає.

Дозвольте трохи повернути відповідь @Stephan Laswieski на голову.

Якщо припустити, що ви не всезнаючі, вам може знадобитися, щоб хтось інший працював над вашим обліковим записом користувача або порадив, як щось робити.

Тоді, коли вони щось роблять або скажуть вам зробити це, це може не працювати, як очікувалося.

У кращому випадку вам доведеться витрачати час на пояснення їм того, що сталося (якщо ви там прямо і можете згадати чи зрозуміти, що псевдонім саме це спричинило проблему).

У гіршому випадку див. Поворот на прикладі в одній з інших відповідей: alias ls = 'rm -rf'.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.