Кращі практики та поради щодо командного рядка Linux?


112

Я хотів би відкрити дискусію, яка б накопичила найкращі практики та поради вашого командного рядка Linux (CLI).

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

Я сподіваюся, що ми всі могли навчитися цьому.

Ви можете поділитися своїми підказками щодо Bash, grep, sed, AWK, / proc та всіма іншими пов'язаними адміністраціями системи Linux / Unix, найкращими методами програмування оболонок на благо всіх нас.


Чому тільки Linux? Багато порад можуть бути корисними майже для всіх ароматів Unix.
mouviciel

Це питання може бути досить широким - достатньо для кращих практик роботи командного рядка Linux / Unix, щоб заповнити цілі книги ...
Jonik

Я погоджуюсь, що поради Unix, які можна застосувати до Linux, також дуже вітаються, я написав Linux, тому що А. Це те, з чим ми тут працюємо. Б. тому, що в останні роки він набуває більш широкого загальнодоступного впливу, ніж Unix.
Максим Векслер

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

Чи є що-небудь із цього? refspecs.freestandards.org

Відповіді:


111

Використовуйте екран , безкоштовний мультиплексор терміналів, розроблений Проектом GNU, який дозволить вам мати кілька терміналів в одному.

Ви можете розпочати сеанс, і ваші термінали будуть збережені навіть при втраті з’єднання, тому ви зможете відновити пізніше або з дому.


2
Найпоширеніші комутатори, які я використовую, є 'screen -D -R' для від'єднання та відновлення мого останнього сеансу на екрані та 'screen -x' для перегляду одного і того ж сеансу екрана з декількох входів. Крім того , отримати собі хороший .screenrc від dotfiles.org/.screenrc
Нік Деверо

4
Ще одна приємна річ, що стосується екрана - це те, що ви можете поділитися терміналом з іншими людьми, коли хочете співпрацювати над чимось, використовуючи екран -x
gareth_bowles

101

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

Чим більше ви його використовуєте, тим більше ви дізнаєтесь про нього. Ви можете використовувати його, щоб зробити деякі дивовижні речі.

Примітка: ВСІ ці речі можна виконувати віддалено, без налаштування на вашому сервері, за винятком запуску ssh-сервера.

Встановіть файлову систему через Інтернет

пошук у мережі SSHFS

Команди вперед .

Протокол SVN + SSH - це Subversion від віддаленого клієнта до сервера, на якому НЕ працює DEAMON! Команда SVN запускає сервер через оболонку ssh і передає інформацію туди-сюди через існуючу трубу. Програма rsync робить те саме, працює проти сервера, де не використовується rsync deamon, запустивши його через SSH. Написати власні файли bash легко, щоб зробити подібні хитрощі.

Ланцюг пройти через брандмауер

Я використовую це весь час, щоб перейти через мій сервер Linux вдома на свій Mac.

Порти
переадресації : Вам здається лише помірно корисним, поки ви не зрозумієте, що можете перейти через домашній брандмауер та налаштувати свій маршрутизатор вдома з роботи, як ніби це робили в домашній мережі).

Пересилає запити X:

Це ще одна дивовижна. З сервером X або без нього, який працює у віддаленій системі, ви можете запустити програму x-windows, і вікно з’явиться на вашому локальному екрані. Просто використовуйте перемикач -X, ось і все!

Оскільки вам не потрібно, щоб на віддаленому сервері працював X-сервер, вплив процесора на ваш сервер мінімальний, ви можете мати сервер TINY Linux, який обслуговує величезні додатки до вашого потужного ігрового ПК під управлінням Windows та cygwin / X.

Звичайно VI та EMACS працюють над SSH, але коли я бігаю вдома, іноді хочеться більше. Я використовую ssh -X для запуску копії Eclipse! Якщо ваш сервер більш потужний, ніж ваш ноутбук, у вас GUI сидить прямо на своєму ноутбуку, але компіляції виконуються на вашому сервері, тому не турбуйтеся про завантаження системи.

Запуск у пакетних файлах

(тобто означає запустити локальний пакетний файл, який "робить речі" для інших систем):

Дві речі поєднуються, щоб зробити це крутим. Перше - ви можете усунути підказки пароля, використовуючи (більш захищені) ключі шифрування. По-друге, ви можете вказати команду на SSH CLI. Я використовував це якимись цікавими способами - як, наприклад, коли компіляція виходить з ладу на віддаленому сервері, я б запустив SSH на свій комп'ютер і відтворив звуковий файл)

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

Вбудований в Mac

І сервер, і клієнт вбудовані в Mac і Linux. Що стосується Mac та Ubuntu, увімкнути сервер так само просто, як знайти потрібний прапорець.

На комп'ютер встановіть cygwin або cygwin / X (cygwin / X дозволить вам переслати х-віконний висновок зі своєї машини Linux на ваш ПК з Windows - він встановить X-сервер)

Важливі поради / конфігураційний файл

Ніколи не використовуйте порт 22 на брандмауері. Ви отримаєте багато спроб злому, це просто не варто. Просто попросіть ваш брандмауер перенести інший порт на ваш сервер.

Існують великі параметри конфігурації, які дозволяють значно спростити свої команди ssh. Ось приклад моєї роботи:

Host home
    hostname billshome.hopto.org
    Port=12345
    user=bill
    LocalForward=localhost:1025 mac:22

Коли я набираю "ssh home" (нічого іншого), він діє так, ніби я набрав:

ssh -p 12345 bill@billshome.hopto.org

а потім пересилає мій локальний порт 1025 до системи "mac" вдома. Причиною цього є те, що у мене є ще один запис у моєму файлі:

Host mac
    hostname localhost
    port=1025

так що після того, як я зробив "ssh home" і все ще відкрив вікно, я можу набрати "ssh mac", і комп'ютер на роботі тут фактично спробує підключитися до власного порту 1025, який був перенаправлений до "mac: 22 "іншою командою, тому він підключиться до мого Mac вдома через брандмауер.

Редагувати - класний сценарій!

Я викопав старий сценарій, який я просто люблю - довелося повернутися і опублікувати його для всіх, хто може зацікавити. Сценарій називається "authMe"

#!/bin/bash
if [ ! -f ~/.ssh/id_dsa.pub ]
then
    echo 'id_dsa.pub does not exist, creating'
    ssh-keygen -tdsa
fi
ssh $1 'cat >>.ssh/authorized_keys' <~/.ssh/id_dsa.pub

Якщо цей скрипт у вашому домашньому каталозі є хостом, до якого ви можете підключитися (через ssh), ви можете ввести "./authMe hostName".

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

Після цього команда SSH більше не запитуватиме ваш пароль під час приєднання до цієї віддаленої системи, вона використовуватиме відкритий / приватний ключ.

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

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


4
+1 дуже приємний та компактний пост
Карстен

2
Невелика примітка про SSH над портом 22: якщо у вас хороший корінний пароль і у ваших користувачів немає жахливих паролів, достатньо лише запустити fail2ban (або щось подібне), щоб уникнути спроб зламати. Мені було дуже прикро тримати SSH на іншому порту.
Девід Уолвер

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

Зараз у більшості версій ssh ​​є вбудована версія вашої останньої команди, вона називається ssh-copy-id, і це так просто, якssh-copy-id user@someserver
JamesHannah

Ще один спосіб зробити трюк 'ssh mac' - використовувати директиву ProxyCommand у вашому .ssh / config-файлі. Хост mac ProxyCommand ssh -q home "nc% h% p" Це запустить netcat (nc) вдома і перенаправить ваше ssh-з'єднання прямо на mac. Мені здається, що це простіше в ланцюжку (наприклад, якщо вам потрібно підключитися до "додому", щоб потрапити на "робочий бастіон", щоб потрапити на "робочий веб-сервер".
toppledwagon

73

Мені подобається користуватися

cd -

для переходу до попереднього каталогу. Дуже корисний!


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

Це одне задоволення.
Мануель Феррерія

69

Нещодавно я виявив pvкоманду (переглядач труб), яка схожа на кішку, але з деталями передачі.

Тож замість

$ gzip -c access.log > access.log.gz

Можна використовувати

$ pv access.log | gzip > access.log.gz
611MB 0:00:11 [58.3MB/s] [=>      ] 15% ETA 0:00:59

Тож замість того, щоб не мати уявлення, коли ваша операція закінчиться, тепер ви знаєте!

З люб’язності Петріса Крумінса


$ gzip -c access.log> access.log.gz Чому б не так: $ gzip

О, це працює :) Я просто взяв приклад із веб-сайту Петерсі.
Нік Деверо

Це виглядає як добре старе tee(1).
Даніель К. Собрал

Надзвичайно корисна утиліта, про яку я завжди забуваю :-(
Patrick

53
sudo !!

Перезапустіть попередню команду як root.

[Поточна головна команда на веб-сайті http://www.commandlinefu.com , тематичний веб-сайт відповідно до цього питання.]


2
Розкриття інформації - я запускаю
commandlinefu.com

9
Врятувало б цього хлопця 16 персонажів: xkcd.com/149

46

Натисніть Ctrl-R і почніть вводити команду (або будь-яку її частину) - вона шукає історію команд. Якщо знову натиснути Ctrl-R, перейдемо до наступного матчу, введемо виконану команду, що відображається в даний момент, і стрілка праворуч (принаймні) дозволить вам відредагувати її спочатку.

$ (reverse-i-search)`svn': svn status

Я раніше 7 років використовував Linux як основну ОС, коли дізнався про це, але тепер, коли я це знаю, це дуже зручно.


Дякую. Я використовував зворотний пошук, але не зміг зрозуміти, як перейти до наступного матчу.
Адам

Ctrl-S переходить до наступного матчу. Можливо, вам доведеться зробити stty -ixonспочатку, щоб вимкнути значення контролю потоку XON / XOFF (це також робить доступним Ctrl-Q, за замовчуванням він відображається таким самим, як Ctrl-V котирування-вставки, але ви можете змінити його на щось інше ). Див. man sttyТа man readlineдля отримання додаткової інформації. sttyКоманда може бути додана в ваш~/.bashrc
Dennis Williamson

45

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

Я використовував оболонку роками, кропітко вводячи вручну назви директорій. Одного разу я спостерігав, як товариш возився по системі, і він продовжував натискати клавішу вкладки. Я запитав "чому ти б'єш вкладку?". Відповідь: вона намагається завершити каталог або ім'я файлу. Хто б здогадався - заповнення вкладки! Введіть трохи файлу чи каталогу, натисніть вкладку, і він спробує закінчити те, що ви ввели (поведінка залежить від того, яка оболонка хоч).

Одного разу сказаний друг спостерігав за мною в командному рядку і спостерігав, як я набираю щось на кшталт:

coryking@cory ~/trunk/mozi $ pushd /etc
/etc ~/trunk/mozi
coryking@cory /etc $ popd
~/trunk/mozi
coryking@cory ~/trunk/mozi $

Хто б здогадався !? Він ніколи не знав про popd/ pushd. Здогадайтесь, ми навіть ...


1
Мені заповнення вкладки здається чимось "очевидним", дуже базовим, але я ніколи не знав про popd / pushd. Смішно справді. :)
Jonik

3
Також дивіться цю відповідь, щоб мати можливість виконувати вкладки набагато більше, ніж команди, файли та каталоги: stackoverflow.com/questions/603696//603919#603919
Jonik,

1
Це так правда. Я дізнався про пошук назад в історії Баша (ctrl-r), спостерігаючи за ким-небудь. Пізніше я зрозумів, що це функція readline, і працював так само в інших програмах, які включають readline (mysql, gdb, python -i, clisp тощо).
sigjuice

2
Як ви могли використовувати "оболонку" роками і не знаєте про заповнення вкладки?
престомація

У роботі з pushd / popd не забудьте згадати команду dirs . Він показує, що знаходиться у стеку pushd / popd.
slm

41

Дізнайтеся Vim.

Це (мабуть, найкращий редактор, але, безумовно, найкращий редактор, доступний на чистому сервері Linux.


1
gvim також найкращий браузер файлів у Windows;)

Це також надзвичайно корисно, адже коли ви знаєте vim, ви можете перевести більшість снарядів у режим ві-сій, а навігація стає надзвичайно простою та швидкою
Патрік

38

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

$ your_command_here & disown

Ви також можете від'єднати запущену програму:

$ your_command_here
# Press <Control-Z> to stop the program and bring it to background:
$ bg
$ disown

6
Використання екрана чудово, тому що ви можете "підключитися" до цього додатка з будь-якого місця пізніше.
престомація

+1, я не чув про відмови.
користувач18911

я знову відмовився, хоча я вже роблю те саме з екраном
Енді

38

Коли я хочу переконатися, що я використовую фактичну команду, а не псевдонім, я використовую провідний зворотний косий рядок:

\rm -rf ~/tmp

це те саме, що "команда rm -rf ~ / tmp"?
Максим Векслер

Я не знав "команди", але це виглядає так само.
mouviciel

4
Ну да , якщо «команда» не є псевдонімом , в цьому випадку ви повинні використовувати команду \ ет -rf ~ / TMP в цьому випадку \ ет -rf ~ / TMP краще
Jamol

@presario, а ти думаєш, що можна було б зробити псевдонім для "/"? Шкода, що я не можу підтримати коментарі :)

Дивіться також аналогічну команду " builtin".
Денніс Вільямсон,

38

Ця порада зробить ваш CLI більш комфортним (принаймні, це робить для мене):

створити ~ / .inputrc файл із наступним вмістом:

"\e[A": history-search-backward
"\e[B": history-search-forward

Перезавантажте bash (наприклад, ввівши "exec bash"). Коли ви введете префікс команди і натисніть стрілку вгору, ви переглянете команди, починаючи з префікса, наприклад, якщо ви введете ssh, він покаже ваші колишні з'єднання з віддаленими оболонками. Якщо ваш запит порожній, стрілка вгору перегляне історію звичайним чином.


3
Зазвичай я прив'язую їх до \ e [5 ~ і \ e [6 ~ (він же "сторінка" та "pagedown") замість того, щоб перев’язувати стрілки, але це зручніше, ніж Ctrl-R / Ctrl-S :)
ефеміент

+1. Я зв'язаний з F8 і Shift-F8, щоб імітувати cmd.exe, але застосовується той самий принцип.
користувач18911

4
+1 заexec bash
Денніс Вільямсон,

Це також навчальне читання man readlineта запам'ятовування його ярликів за замовчуванням
SaveTheRbtz

Ви також можете зробити bind -f ~/.inputrcперезавантаження inputrc без необхідності запускати новий баш і стерти своє поточне середовище.
Патрік

36

Використовуйте &&замість того, ;щоб виконувати кілька команд одночасно. Він зупиняється, коли виникає помилка, і не виконує інші команди.

Класичний приклад:

./configure && make && make install

1
Ця практика настільки занижена! Повинно бути стандартною практикою закінчувати кожен рядок скрипту оболонки && та використовувати "true" як фінальну команду.
користувач18911

3
що смішно в тому, що я не знав про ";" команда раніше - Я ВИНАГИ використовував "&&".
Нік Клауер

4
Ви можете запустити сценарії оболонки з "#! / Bin / sh -e". Це зупиняється, якщо будь-яка лінія виходить з ладу.
stribika

3
Ви можете використовувати подвійну трубу для пункту "else":dosomething && echo "success" || echo "teh fail"
Денніс Вільямсон,

2
Нещодавно на Planet Debian з'явилася примітка, що погана практика використовувати -e на лінії shebang. Замість цього використовуйте set -e в тілі сценарію. Таким чином, сценарій не працює інакше, якщо хтось запускається з використанням файлу sh $.
птман

32

Під час написання циклів у командному рядку в bash я часто призначаю ризикові команди з командою 'echo'.

for item in items; do echo something-risky; done

Таким чином я можу побачити "щось ризиковане" в повному обсязі, перш ніж взяти на себе зобов'язання виконувати його. Допомагає, коли ваша ризикована команда включає змінні розширення та глобуси. І "set -x" дуже корисний при написанні скриптів bash.

'set -x' дозволяє налагоджувати. Див. Http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_03.html для отримання інформації про налагодження bash.


3
Я теж це роблю, дуже зручна хитрість!
користувач18911

1
+1 Це може бути рятувальником життя! або збереження даних ...
Девід Онелл

31

Вимога

Вам потрібно перевірити максимальну пропускну здатність між двома серверами.


Рішення

На SERVER1 зробіть:

nc -u -l 54321 > /dev/null

На SERVER2 виконайте:

dd if=/dev/zero bs=1MB | nc -u SERVER1 54321 &
pid=$(pidof dd)
while (( 1 )); do kill -USR1 $pid; sleep 2; done

Ви побачите такі результати, як:

182682000000 bytes (183 GB) copied, 1555.74 seconds, 117 MB/s
182920+0 records in
182919+0 records out

117 МБ / с - це цікавий фактор, який показує фактичну пропускну здатність мережі.

Пояснення :

Оскільки пакет почне надходити по мережі, ви зможете побачити статистику пропускної здатності на SERVER2, що є досить хорошою оцінкою фактично максимальної можливої ​​пропускної здатності між двома серверами.

Копіювання через UDP (для запобігання накладних витрат TCP).

Копіювання з сервера (/ dev / zero) на SERVER1 в пам'ять (/ dev / null) на SERVER2, тим самим запобігаючи вводу / виводу диска в вузьке місце.


4
Будьте впевнені, що ssh не налаштовано для використання стиснення в .ssh / config, 'хоч. Інакше ви отримаєте дійсно приємні номери, дуже далекі від істини ;-)
Йоахім Зауер

Lol, так. SSH збирається зашифровувати та розшифровувати ваш процесор, що також викине цифри.

використовувати замість netcat
bendin

+1 для мережі. накладні витрати SSH будуть перекосити ваші номери
Mikeage

Відновлюється, щоб змінити пропозиції @saua, @Daniel Von Fange та @bendin. Дякую за ваші пропозиції, хлопці.
Максим Векслер

23

Бачити структури кольорових каталогів простіше.

alias ls="ls --color=tty"

Редагувати

alias ls="ls --color=auto"

5
Я віддаю перевагу --color = auto, оскільки він не надсилає символи управління сміттям, якщо перенаправлення до файлу ви також можете зробити псевдонімом grep = "grep --color = auto", щоб виділити відповідні шаблони.

+1 для --color = авто; хтось може доповнити відповідь на це?
Джонік

Я думаю, що Tty робить те саме, що і авто тут.
Джошудсон

Оновлено, щоб відобразити колір = авто
Suroot

Як не дивно, забарвлення робить речі набагато менш читаними для мене. Наприклад, жовто-білий колір - це не гарний вибір забарвлення.

20

Деякі невеликі вказівки щодо перегляду журналу:

  1. Ви можете використовувати хвіст -F, щоб продовжувати дивитися журнал після його врізання (на прикладі log4j).
  2. Ви можете використовувати менше: Відкрийте менше, натисніть SHIFT + F, щоб імітувати поведінку хвоста. Також корисною комбінацією є -S для відключення загортання рядків. менше дозволить вам шукати в журналах.

1
І tail -fви можете переглядати кілька журналів одночасно! Напр .:tail -f log1.txt -f log2.txt
Стю Томпсон

@StuThompson: Дякую не знав цього. Додатково ви можете замовити vanheusden.com/multitail
Максим Векслер

20

Я довго навчився трюку від друга, щоб легко змінити розширення файлу:

mv my_filename.{old,new}

Розширення оболонки розширить це до:

mv my_filename.old my_filename.new

Це також можна використовувати для перейменування файлу іншими способами, наприклад, додавши щось у:

mv my_{,cool_}filename

6
Просто не забудьте вводити будь-які символи чи інші вирази шаблону в одну команду, інакше глобус може розширитися до більш ніж 2 аргументів! mv *. {old, new}, ймовірно, дасть справді дивовижні результати.

Так, домовились - це важливий застереження :)

2
Можна також ввести, наприклад, ls -l /bin/cпотім натиснути Alt-Shift- {і це завершить щось на зразок ls -l /bin/c{at,h{grp,mod,own,vt},p{,io},sh}для вас.
Денніс Вільямсон,

19

Використовуйте "tar xf" для витягування стислих архівів. J для bzip2 та z для gzip не потрібні, оскільки tar визначатиме тип файлу вашого архіву. Ні аргумент "-" перед аргументами. Ви заощадите багато часу (понад тисячоліття ;-)).

Ще краще використовувати unfoo, щоб витягти будь-який архів за допомогою однієї команди без зайвих аргументів.


Так, у мене є alias ut="tar xf"- витяг архівів ще простіше.
Девід Волвер

Це не вдається в деяких дистрибутивах RHEL, якщо ви їх використовуєте.
pvsnp

Новий тар також має перемикач "J" для стискання до архівів xz (7zip)
Hubert Kario

Або встановити ОНП: packages.debian.org/sid/unp . Я думаю, це схоже на unfoo.
Zitrax

17

Встановіть пакет bash-завершення. Він містить ряд заздалегідь визначених правил завершення роботи оболонки. Увімкніть це, ввівши "source / etc / bash_completion", якщо дистрибутив не зробить це за вас. Тоді, наприклад, щоразу, коли ви закінчите після kpdf, ви побачите лише список каталогів та файлів PDF. Це так само розумно, як і завершувати віддалені файли після scp ssh: // server / XXX (якщо ви ввімкнули вхід без паролів).


17

Я постійно використовую ці

ALT-. (ESC +. У деяких терміналах) копіює останній використаний аргумент (суперкорисний)

CTRL-W видаляє слово

Чіткий термінал CTRL-L (наприклад, чітка команда, але швидше)

ALT-B (ESC + B у деяких терміналах) пересуває слово назад

ALT-F (ESC + F у деяких терміналах) рухає слово вперед

CTRL-E перейти до EOL

CTRL-Стрибок до BOL

Пошук в історії CTRL-R


1
Дякуємо, що поділилися ярликами! Мені не доводилося ALT-B / F працювати в Mac.
Лео Леопольд Герц 준영

Чудовий чоловік ....
Дауд Ахмад Хохар

16

У баш, я використовую ! $ Багато. Він повторює останній аргумент останньої команди:

ls /really/long/command/argument/that/you/dont/want/to/repeat.txt
vi !$

Він запустить ls, тоді, якщо ви хочете відредагувати його, вам не доведеться його повторно вводити, просто використовуйте! $. Це дійсно корисно для довгих імен файлів / файлів. Крім того ,! * Повторює всі аргументи попередньої команди. Я не так багато використовую, але це здається корисним.

Я знав, що їх згадували, але я використовую vim, screen і CD - дуже багато.

Я забув noclobber:

set -o noclobber

Від man bash :

Якщо встановлено, bash не замінює існуючий файл операторами перенаправлення>,> & та <>. Це може бути скасовано під час створення вихідних файлів за допомогою оператора перенаправлення> | замість>.


6
Я не використовую $!, Як це дуже легко знежирити палець, але мені подобається бити ^ [-. (період втечі), щоб отримати той же ефект.
Девід Уолвер

7
Залежно від клавіатури тощо, ви можете це зробити Alt-.також.
Денніс Вільямсон,

Омг, крихітний оргазм, ти Деннісе!
artifex

14

Переключіться з bash на zsh і побачите, як ваша продуктивність покращиться:

  • Дійсно інтелектуальне завершення вкладок. Він доповнює не лише командні рядки, але всі параметри, назви керівних сторінок, назви пакетів (для apt-get / emerge тощо) та те, що у вас є. І надає корисне пояснення варіантів під час завершення. Все це без використання місця прокрутки після видачі команди.
  • Вкладка заповнення макетів; напишіть cat * .txt, натисніть вкладку та виберіть один із файлів, що відповідають виразу.
  • Перемикайте каталоги лише набравши їх імена.
  • Кілька режимів редактора рядків Може поводитись як vi або emacs, якщо ви цього хочете.
  • Налаштовані прив'язки клавіш, щоб робити все, що завгодно.
  • Тематичні підказки, включаючи можливість розміщення оперативної інформації в правій частині екрана та автоматичне приховування під час введення довгої команди

Google розповість вам ще багато переваг.


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

Чи вдалося їм включити підтримку unicode?

@ Кори добре, я просто не хотів плагіатувати, і мені стало зайвим писати своє, коли вже так багато хороших речей, які написали інші :)

@kyku так, є відповідна підтримка unicode, можливо, рік тому.

виглядає круто. я пострілю!

13

Стара школа, переміщаючи дерево каталогів з одного місця в інше, зберігаючи символьні посилання, дозволи та все, що добре:

tar cBf - . | (cd /destination; tar xvBpf -)

або по всій мережі

tar cBf - . | rsh foo.com "cd /destination; tar xvBpf -)

Нова школа:

rsync -urltv . /destination

або по всій мережі

rsync -urltv -e ssh . foo.com:/destination

tar xvBpf - -C /destination== (cd /destination; tar xvBpf -) Трохи менше вводити текст і простіше у використанні над ssh.
ефеміент

1
-a - це те саме, що і '-rlptgoD' - тобто рекурсуйте, копіюйте символьні посилання як символьні посилання, зберігайте perms, зберігайте часові позначки, зберігайте групи, зберігайте власників, копіюйте файли пристроїв та спеціальні файли як пристрої та спеціальні файли. Також між машинами, -z (стискання файлів перед відправленням, розпакування після отримання) корисно. rsync -avz [-e ssh] є вашим другом :-)
dr-jan

Чи робить -z щось корисне за ssh? Я б не вважав цього.
Пол Томблін

rsync -avhнайкраще на одній машині - hгарантує, що жорсткі посилання передаються правильно, не перетворюючи кожне посилання в окремий файл, хоча якщо у вас величезна кількість файлів, він може використовувати багато пам'яті. rsync -avzh . foo.com/destinationє еквівалентом для мережі, і зазвичай вам не потрібен, -e sshоскільки rsync буде знати, щоб використовувати ssh.
RichVel

Насправді ці дні я використовуюrsync -aSHuvrx --delete / --link-dest=/backup/$PREV /backup/$HOUR
Пол Томблін

13

Вимога : у вас є каталог, що містить великий список файлів, які ви хочете видалити. rm -r не вдасться!

приклад

find /var/spool/mqueue/ | wc -l
191545
rm -f /var/spool/mqueue/*
-bash: /bin/rm: Argument list too long

Рішення :

find /var/spool/mqueue/ -xdev -exec command rm -f '{}' +

Пояснення :

Редагувати: виправлення пояснення після коментаря @ephemient.

find подасть аргументи в rm максимально дозволеними аргументами. Це дозволить rm видаляти файли партіями, що є найшвидшою технікою, яку я знаю, не використовуючи операцію -delete пошуку себе. Це рівнозначно

find /var/spool/mqueue -xdev -print0 | xargs -0 rm -f

який може вам бути корисним, якщо ваш findне підтримує -exec ... +.


5
Замініть \;на +: тоді findзробить те, що xargsробить за замовчуванням, а це - збір аргументів якнайбільше (без перевищення ліміту списку аргументів). Або просто використовувати -deleteintead -exec rm(GNU Findutils потрібен для обох)
ефемія

Хороший підказок - я не знав "+".
codeinthehole

@ephemient: Хороший коментар, я відредагував пост.
Максим Векслер

2
Цікаво, що про "+" я не чув.
користувач18911

або просто find ... -delete, якщо ваша знахідка наділена таким чином.
Девід Уолвер

11

Я використовую ці два поради так часто, що я думав, що було б гарною ідеєю поділитися:

!foo

Запустить останню команду у файлі історії, починаючи з "foo" (я часто використовую її під час компіляції, !gccнаприклад.)

Інший - це комбінація клавіш (Ctrl + O замість Return). Це виконає команду ТА відобразить наступну команду у файлі історії. Наприклад, коли я компілюю і тестую файл, я завжди виконую 3 або 4 команди, складаю, cd до dir тесту, запускаю тест, cd до dir makefile. Використання Ctrl + O це полегшує це завдання :)

Сподіваюся, що це допоможе!


1
+1 для Ctrl-O
Денніс Вільямсон,

10

Як використовувати підрив в Linux без допомоги фантазійних графічних інтерфейсів, які можуть бути недоступними.

svn co <repo-url> . # Checks out project into current folder

svn update # Get latest changes from server

svn status # Shows what files have changed locally

svn add <path/filename> # Add some file to the repo

svn commit # Commit your changes to the repo

Це, як не дивно, стримує багато розробників від використання Linux.


rapidsvn - приємна маленька гія для svn під Linux.

Безумовно, доступні багато фантазійних, потужних графічних інтерфейсів (як, наприклад, в IntelliJ IDEA), але мені подобається можливість використовувати або ті, або командний рядок (також потужний, але різний), - що краще підходить для поточної ситуації
Jonik

Мій улюблений на сьогоднішній день - NautilusSVN (подібно TortoiseSVN): code.google.com/p/nautilussvn
користувач7655

10

Більшість занедбаних команд старої школи: find

Вчора я відремонтував грубу помилку:

for u in nr dias simonpj; do
   sudo -u $u find . -type d -exec chmod g+s '{}' ';'
done

Так! Дізнайтеся команду find. Знайдіть змішані з xargs, sed та awk для обробки файлів жугернаут!
Jonathon Watney

Домовились! Хоча я ніколи нічого не пам'ятаю про sed і awk - мені завжди потрібно це вивчити! Я справді повинен роздрукувати шпаргалку.

Так, але не забувайте використовувати для xargs опцію -print0 та -0, щоб уникнути складних проблем, пов’язаних з назви файлів файлів, що містять незвичні символи (наприклад, зворотна косої риски).
користувач18911

Так, напевно , половину часу я використовую знайти це виправити дурні дозволу речі: chmod 644 $(find . -type f),chmod 755 $(find . -type d)
David Wolever

1
Не забувайте про -permможливість findпошуку файлів, які мають певні способи доступу.
Денніс Вільямсон,

8

Для оболонок типу bashта ksh, ви можете змусити командний рядок відповідати на команди навігації, такі як ваш текстовий редактор:

set -o emacs

або

set -o vi

дозволить вам шукати свою історію та переміщуватися по командному рядку так, як ви звикли робити в текстових файлах (наприклад, у режимі vi, натискаючи ESCпотім клавішу, /stringви шукаєте попередні команди за "рядком" - ви можете використовувати nта Nпереміщувати між матчами)


Невелика помилка: "тестовий редактор" має бути "текстовим редактором"

8

grep - мій друг. Серйозно.

Список .rbфайлів, що містять текст class foo:

grep -l "class foo" .rb

Список .rbфайлів, які не містять текст class foo:

grep -L "class foo" *.rb

Перелічіть .rbфайли, які не містять foo або bar (ви можете використовувати будь-яке регулярне вираження з -e, але вам потрібно уникнути операторів):

grep -L -e "foo\|bar" *.rb

Можливо, вас зацікавить інструмент під назвою "ack", який робить те саме, що і grep, але рекурсивно скануватиме лише джерельні файли. Дайте йому спробувати (це безкоштовно): betterthangrep.com

8

Заміна оболонки проводиться ^:

/home/eugene $ ls foo.txt
foo.txt
/home/eugene $ ^ls^rm
rm foo.txt
/home/eugene $ ls foo.txt
ls: cannot access foo.txt: No such file or directory

2
Насправді я віддаю перевагу "!!: gs / foo / bar", оскільки часто виявляю, що foo згадується не раз у попередній команді, і я хочу глобальну заміну (наприклад, "mv foo.txt foo.bak").
користувач18911
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.