Ярлык ссылка на url directory shell cmd как удалить

Ярлык ссылка на url directory shell cmd как удалить

Как Удалить Ярлык-Вирус На Компьютере/Ноутбуке в Windows 11/10/8/7

Хотите узнать, как удалить вирус создающий ярлыки из Windows 10/8/7? Что ж, вам повезло. Существует в общей сложности три способа лечения от ярлык-вируса с вашего компьютера. Одним из них является shortcut virus remover, который помогает быстро удалить вирус. Затем вы можете использовать инструмент для восстановления данных, если они пострадали в процессе лечения от вируса.

3 Способа Удалить Ярлык-Вирус в Windows 11/10/8/7

Чтобы удалить ярлык-вирус на ПК с Windows 10/8/7 или USB:

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

СравнениеCMD(Рекомендуем)Реестр(По желанию)Антивирусное ПО(По желанию)
ПрименимостьВнешние и внутренние устройстваКомпьютеры и ноутбукиНаходит и удаляет инфицированные файлы на ПК
Безопасность данныхНужно быть осторожным. (Неправильное применение может привести к потере данных.)Ошибочные действия приведут к сбою в работе программ или всего компьютера.Есть гарантия результата
Простота использованияДаНетДа
Платно или бесплатноБесплатноБесплатноБесплатно/Платно

Способ 1. Лечение и Удаление Ярлык-вируса с Помощью CMD [Бесплатно]

Применимо к внешним и внутренним устройствам

Если ваши внешние устройства, такие как USB флэш-накопитель, внешний жесткий диск или SD карта памяти, заражены ярлык- вирусом, то вам следует немедленно приступить к удалению вируса. Инфекция распространяется дальше каждый раз, когда вы подключаете другое внешнее устройство к ПК или ноутбуку с ОС Windows.

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

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

Шаг 2.Наберите Командная Строка в поле поиска и нажмите Командная Строка чтобы запустить её. Введите логин и пароль административной учётной записи, если система запросит.

Шаг 3.Введите букву проблемного диска, введите двоеточие и нажмите Enter. Например, если буква USB-накопителя или жесткого диска H, наберите H: и нажмите Enter..

Шаг 4.Наберите del *.lnk и нажмите Enter.

Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить

КомандаЗначение
-sснимает статус «системный файл» со всех таких файлов и папок.
-rотменяет статус «только для чтения» для всех таких файлов и папок.
-hудаляет статус «скрытый» из всех скрытых файлов и папок.
/sзаставляет команду рекурсивно применяться ко всем файлам и папкам в текущем каталоге и во всех подкаталогах, в данном случае ко всему устройству.
/dделает команду применимой и к папкам (обычно attrib обрабатывает только файлы).
*.*означает, что для обработки будут выделены все имена файлов и папок

Способ 2. Удаление/Уничтожение/Лечение Ярлык-вируса из Реестра

Относится к компьютерам и ноутбукам

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

Шаги для удаления вируса из Реестра:

Шаг 2.В Редакторе Реестра перейдите к HKEY_CURRENT_USER > Software > Microsoft > Windows > CurrentVersion > Run..

Шаг 3.Найдите подозрительные ключи, похожие на odwcamszas, WXXKYz, ZGFYszaas, OUzzckky, и удалите их.

Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить

Способ 3. Запустите программу для удаления вирусов-ярлыков или антивирусное программное обеспечение.

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

Шаги по удалению вируса с помощью бесплатного антивирусного программного обеспечения:

Далее, мы будем использовать Norton Power Eraser для примера:

Шаг 1.Скачайте и запустите Norton Power Eraser.

Если будет доступна новая версия, то Norton Power Eraser проверит это и загрузит ее.

Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить

По умолчанию, Norton Power Eraser выполняет поиск руткитов и просит перезагрузить систему. Если вы увидите предложение перезагрузить компьютер, нажмите Restart.

Если вам не нужно сканировать на наличие руткитов, зайдите в Settings и снимите флажок Include rootkit scanning.

Шаг 3.В зависимости от вашего случая выполните одно из следующих действий:

Шаг 4.После успешного удаления угрозы, нажмите Finish.

EaseUS Data Recovery Wizard

Далее, разберёмся как легко и быстро работает этот способ восстановления данных.

1. Загрузите и установите на свой компьютер EaseUS Data Recovery Wizard.

Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить

2. Используйте установленную программу для поиска и восстановления потерянных данных. Выберите раздел диска или папку, из которой «пропали» ваши данные. Затем нажмите кнопку «Сканировать».

Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить

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

Выберите их и нажмите кнопку «Восстановить». При выборе места для сохранения восстановленных данных не следует использовать тот же диск, который вы сканировали!

Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить

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

Посмотрите наше обучающее видео как восстановить файлы на жёстком диске:

Включение Брандмауэра Windows для Предотвращения Заражения Вирусом-Ярлыком

Вот как можно включить брандмауэр:

Шаг 1.Откройте Панель Управления, нажмите Брандмауэр Защитника Windows, и выберите Включение и отключение брандмауэра Защитника Windows.

Шаг 2.Переключите каждый тип сети в положение Включить брандмауэр Защитника Windowsи нажмите OK в самом низу.

Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить

Итоги

Если ваш компьютер когда-нибудь заразится ярлык-вирусом, то одно из вышеприведенных решений должно вам помочь. После удаления вируса обязательно включите брандмауэр Windows для лучшей защиты. Кроме того, если вы потеряете какие-либо данные в процессе удаления вируса, то воспользуйтесь программой EaseUS для восстановления данных на жёстком диске чтобы восстановить потерянные файлы.

FAQ Как Удалить Ярлык-Вирус

Ответим на несколько часто задаваемых вопросов об удалении ярлык- вируса. Обязательно ознакомьтесь, здесь есть ответы на ваши вопросы.

Как удалить ярлык-вирус с USB-накопителя?

Чтобы удалить ярлык-вирус с флешки/USB-диска::

Шаг 1.Подключите внешний жёсткий диск к компьютеру, нажмите правой кнопкой на Пуск, и выберите Найти.

Шаг 2.Наберите Командная строка в поле поиска и кликните Командная строка чтобы запустить её.

Залогиньтесь под вашим аккаунтом администратора, если запросит система

Шаг 3.Наберите E: и нажмите Enter. (Замените E:на букву вашего USB-диска или флешки.)

Шаг 4.Наберите del *.lnk или del autorun.inf и нажмите Enter..

Как удалить файл ярлыка?

Чтобы удалить ярлык:

Шаг 1.Кликните правой кнопкой по иконке и выберите Удалить..

Шаг 2.Выберите Да чтобы подтвердить удаление.

Какой антивирус лучший для удаления вируса-ярлыка?

Вот несколько эффективных антивирусных инструментов:

Ваш внешний жесткий диск запускается медленно при открытии или перенесении файло.

Здесь вы узнаете, как восстановить удалённые файлы с жёсткого диска с помощью пр.

EaseUS Data Recovery Wizard Crack — это программное обеспечение для восстановлен.

Не волнуйтесь, если ваш жесткий диск не отображается на компьютерах с Windows. И.

Ремонт компьютеров в Самаре

Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалитьНекоторые приложения, которые вы устанавливаете в систему, добавляют себя в качестве опций контекстного меню Windows, тем самым «захламляя» его. Оно разрастается и значительно усложняет оперативный поиск нужного пункта. Эта статья расскажет вам о том, как с помощью изменения реестра можно отключить отображение ненужных пунктов в контекстном меню.

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

Инструкция

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

HKEY_CLASSES_ROOT\*\shell
HKEY_CLASSES_ROOT\*\shellex\ContextMenuHandlers
HKEY_CLASSES_ROOT\AllFileSystemObjects\ShellEx

2. Работа некоторых пунктов контекстного меню может настраиваться следующими ключами:

3. В случае, если вам не удалось найти ключ, соответствующий пункту меню по указанным выше подсказкам, вам придется поискать их самостоятельно.

Работаем с ключами стандартной оболочки

1. Давайте рассмотрим один конкретный случай. Например, в ветке HKEY_CLASSES_ROOT\Directory\shell вы нашли ключ «AddToPlaylistVLC» с параметром по умолчанию «Add to VLC media player and Play with VLC». Он управляет одной очень популярной мультимедийной опцией в системном контекстном меню. С подобными ключами в секции настройки оболочки «shell» очень легко работать.

2. Если вы хотите скрыть одну из стандартных записей, то став на ключ «AddToPlaylistVLC» в правой панели редактора, вызовите из контекстного меню функцию создания нового строчного параметра. Присвойте ему имя «Extended». Таким образом, ниже параметра по умолчанию основного ключа, добавится вторая строчка с новым параметром и пустым значением в поле «Data». Этого будет достаточно для скрытия выбранного пункта в контекстном меню.

3. Если вы хотите ключ только отключить, но не скрывать его, то вам следует добавить другой строчный параметр – «LegacyDisable».

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

Как убрать лишние команды из контекстного меню Windows

Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить

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

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

Сегодня мы покажем Вам, как вы можете удалять элементы, редактируя свой реестр, а также более простой метод очистки, используя пару бесплатных сторонних приложений. Мы также укажем вам, как добавить несколько полезных команд. Без особых усилий вы можете «засорить» контекстное меню только полезными командами – оптимизированными и эффективными.

Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить

Редактирование реестра контекстного меню

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

Стандартное предупреждение: редактор реестра является мощным инструментом и неправильное использование может сделать вашу систему нестабильной или даже неработоспособной.

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

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

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

Удалить элементы «Shell»

Давайте рассмотрим один пункт в качестве примера. Я использую видеоплеер VLC. Когда я установил его, VLC добавил элемент контекстного меню с названием «Добавить в плейлист VLC». Я никогда не использую его и, скорее всего, не буду использовать.

Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить

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

Я заметил AddtoPlaylistVLC ключ во время просмотра shell, ища элементы для удаления. Элементы под обычным shell-ключом, как правило, очень легко обнаружить и понять значение.

Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить

У нас есть несколько вариантов того, как справиться с этим. Мы могли бы просто удалить этот AddToPlaylistVLC полностью, и это приведет к удалению элемента из контекстного меню. Однако, если вы не создадите резервную копию своего реестра или сначала не экспортируете ключ, вам будет нелегко его вернуть, если передумаете.

Второй вариант – отключить ключ, а не удалять его. Для этого просто щелкните правой кнопкой мыши AddToPlaylistVLC или любой другой ключ, с которым вы работаете, и выберите СоздатьСтроковый параметр. Назовите новое строковое значение LegacyDisable.

Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить

Как только вы создадите LegacyDisable, изменения произойдут незамедлительно. Щелкните правой кнопкой мыши файл или папку в Проводнике файлов, и Вы увидите, что элемент «Добавить в плейлист VLC» исчез из контекстного меню.

Чтобы сделать это, щелкните правой кнопкой мыши AddToPlaylistVLC или любой другой ключ, с которым вы работаете, и выберите СоздатьСтроковое значение. Назовите его Extended.

Удалить элементы Shellex

Вероятно, вы заметили, что некоторые из общих ключей реестра, которые мы указали в верхней части этого раздела, имеют название «shellex» (расширение оболочки) вместо имени «shell». Вам придется обрабатывать эти типы ключей немного по-другому.

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

Элементы shellex немного сложнее расшифровать, но Вы можете определить элемент по имени ключа слева. Здесь мы будем работать с Yandex.Disk.3 внутри ContextMenuHandlers.

Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить

Когда Яндекс.Диск будет установлен, он добавит команду «Скопировать ссылку на Яндекс.Диске» в контекстное меню. Поскольку я больше занимаюсь перетаскиванием, я никогда не использовал эту команду, и собираюсь избавиться от неё.

Здесь не получится использовать трюки с указанными выше LegacyDisable и Extended. Но, Вы можете удалить весь DropboxExt-ключ, чтобы удалить его из контекстного меню (и обязательно верните ключ, если вы это сделаете), но есть простой способ его отключить. Просто выберите ключ слева, а затем дважды щелкните по значению (По умолчанию), чтобы открыть окно свойств.

Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить

Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить

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

К сожалению, когда дело доходит до ключей shellex, невозможно скрыть их в расширенном контекстном меню так, как мы делали это с элементами оболочки. Их можно либо удалить, либо отключить.

Исследуйте другие местоположения по типу файла

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

Например, вы хотите удалить пункт меню для открытия документа Excel (XLSX) в Excel, когда вы щелкаете его правой кнопкой мыши. Зачем вам это делать? Это только пример. Другие приложения также могут добавлять разные типы команд, которые вам не нужны.

Вы можете начать с просмотра следующего ключа реестра для расширения XLSX:

Столбец данных Значение для ключа (По умолчанию) позволяет узнать, что фактический тип файла – Excel.Sheet.12.

Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить

Теперь вы можете перейти к этому расширению:

Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить

Теперь, когда вы нашли правильный shell-ключ, вы можете использовать те же методы, которые мы описали в предыдущем разделе, об элементах «shell», чтобы удалить, отключить или скрыть элемент в расширенном контекстном меню. Помните строковые значения LegacyDisable и Extended? Да, эти приёмы здесь тоже работают.

Управление контекстным меню с помощью NirSoft Utilities

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

Почему два инструмента? Потому что один из них обрабатывает обычные элементы оболочки, а один обрабатывает элементы shellex. Они намного проще в использовании, чем редактирование реестра, но закулисное понимание того, как эти инструменты обрабатывают реестр, даст вам возможность разобраться во всех элементах, отображаемых этими инструментами.

Начните с загрузки обоих инструментов. Первым инструментом является ShellMenuView, который обрабатывает обычные элементы оболочки. Второй инструмент – ShellExView, который обрабатывает элементы shellex. Прокрутите вниз до нижней части обеих этих страниц, чтобы найти ссылки для загрузки. Инструменты и работают с почти любой версией Windows – от 98 вплоть до 10.

В окне ShellMenuView просто посмотрите список, пока не найдете элемент, который хотите отключить. Вы можете только отключать элементы с помощью этих инструментов, а не удалять их или скрывать в расширенном контекстном меню. И, кстати, эти инструменты отключают элементы, создавая LegacyDisable внутри соответствующего ключа – так же, как мы это делали при редактировании реестра вручную.

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

Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить

Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить

В итоге, Вы будете удивлены тем, насколько приятнее использовать чистое контекстное меню, в котором есть только нужные команды. И так, чего же Вы ждете? Пришло время начать делать эти контекстные меню более полезными!

Ярлык ссылка на url directory shell cmd как удалить

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

Код
<—————————————————————->
function CreateLinkDesktop(Const FileName : String) : String;
var
MyObject : IUnknown;
MySLink : IShellLink;
MyPFile : IPersistFile;
Directory : String;
WFileName : WideString;
MyReg : TRegIniFile;
begin
MyObject := CreateComObject(CLSID_ShellLink);
MySLink := MyObject as IShellLink;
MyPFile := MyObject as IPersistFile;
with MySLink do begin
SetPath(PChar(FileName));
SetWorkingDirectory(PChar(ExtractFilePath(FileName)));
end;
MyReg := TRegIniFile.Create(‘Software\MicroSoft\Windows\CurrentVersion\Explorer’);
[I]//создание ярлыка на рабочем столе[/I]
Directory := MyReg.ReadString(‘Shell Folders’,’Desktop’,»);
WFileName := Directory+’\[B]Имя ярлыка.lnk[/B]’;
MyPFile.Save(PWChar(WFileName),False);
MyReg.Free;
end;
<—————————————————————->

А как можно удалить этот ярлык?
Нигде об этом ничего не сказано.

Vitaly Nevzorov
Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалитьЯрлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалитьЯрлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалитьЯрлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить

Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207

Ярлыки хранятся как обычные файлы в папке о которой система знает как Desktop. Как найти эту системную папку (и другие тоже) я писал здесь на форуме:

Далее обычной функцией DeleteFile удаляешь нужный ярлык

Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 

0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »

 

[ Время генерации скрипта: 0.0993 ] [ Использовано запросов: 21 ] [ GZIP включён ]

Один из способов сделать это возможно, добавив Открыть с опция контекстного меню, которая не существует по умолчанию для файлов ярлыков Интернета. Помимо Open with, есть и другие способы запуска ярлыка сайта с использованием нестандартного веб-браузера.

Открыть ярлыки на сайте в любом браузере через контекстное меню

Способ 1. Использование меню «Открыть с помощью»

(дефолт) значение данных установлено в

Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалитьЯрлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить

Это запускает диалог Открыть с помощью. Если браузеры не по умолчанию не перечислены на первом экране, нажмите Больше приложений ↓

Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалитьЯрлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить

Выберите ваш браузер по ссылке и нажмите ОК.

Способ 2. Добавление ярлыков веб-браузера в меню «Отправить»

Вот стандартный метод, который используют многие люди — меню «Отправить». Откройте папку SendTo вашего профиля пользователя (введите shell:sendto в диалоговом окне «Выполнить») и поместите ярлыки браузера в эту папку. Затем щелкните правой кнопкой мыши ярлык веб-сайта, нажмите «Отправить» и откройте ссылку в браузере не по умолчанию.

Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалитьЯрлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить

Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалитьЯрлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить

Метод 3: Использование команды ленты «Открыть с помощью» в контекстном меню (список зарегистрированных браузеров)

Скачайте url-openwith-modern.zip, разархивируйте и запустите файл REG. Дополнительная команда «Открыть» добавлена ​​в контекстное меню для файлов URL с подменю, содержащим список установленных браузеров. В этом списке перечислены все веб-браузеры, установленные и зарегистрированные в программах по умолчанию. Этот метод использует Windows.OpenWith Команда ленты в контекстном меню, и она работает только в Windows 8 и Windows 10.

СВЯЗАННЫЙ: Как добавить команду ленты в контекстное меню в Windows 10?

Следующий ключ реестра добавляется с помощью этого метода:

Строковое значение (REG_SZ) ExplorerCommandHandler установлен в

Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалитьЯрлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить

Список зарегистрированных браузеров показан в подменю. Приложения, кроме веб-браузеров, не перечислены. Оболочка заполняет этот список браузеров при регистрации программ по умолчанию (приложений по умолчанию).

Недостатком этого метода является то, что дополнительный открыто Команда (с подменю) будет отображаться в контекстном меню, как показано выше. Его заголовок и значок меню не могут быть изменены через реестр. Как было сказано ранее, это меню «Открыть с помощью» работает только в Windows 8 и Windows 10.

Способ 4: добавление каскадного меню со списком всех браузеров

Этот метод использует отличную функцию каскадного меню в Windows. Работает в Windows 7 и выше, включая Windows 10.

Теперь у вас есть аккуратное меню Open with Cascading с списком курируемых веб-браузеров.

Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалитьЯрлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить

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

Значение для изменения подкоманды

Его значения данных по умолчанию установлены как:

Например, если вы не используете Internet Explorer, вы можете изменить значение данных на:

Должно быть легко адаптировать параметры реестра в способе 4 для большего количества веб-браузеров.

Показанное изображение Изабель Роденас из Pixabay

Самый быстрый способ открыть cmd в текущей папке с помощью ярлыка (Windows 8/10)?

Я использовал Shift + mouse right click чтобы открыть cmd в текущей папке. Думаю, это самый быстрый способ, в суперпользователе есть какое-то подходящее решение:

нужно ввести 4 ключа и набрать 3 раза. (Я думаю, что это работало на всех окнах (по крайней мере, от 7 до 10 я тестировал)

Есть ли более простой и быстрый способ сделать это в Windows 10?

5 ответов 5

Простой способ с 3 клавишами, никаких дополнительных настроек не требуется:

Нажатие Alt + D откроет меню в проводнике Windows с включенной и показанной мнемоникой.

Там нужно всего три ключа в Windows 8/10:

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

Для соменое мнение, что ярлык не работает:

Я бы показал вам, как найти правильный ключ здесь

примечание: мой системный язык китайский, но компоновка такая же, вы не пропустите.

Вам нужно открыть папку

зеленая папка не настоящая папка (ярлык не работает), но папка в красной зоне в порядке

Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить

Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить

Это F в моей системе. F может быть другой в вашей системе, просто замените его.

Удерживая Alt + F (замените F вашей системной клавишей File ), вы также увидите метку горячей клавиши.

Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить

Тогда просто сделайте:

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

Еще один метод по умолчанию для всех клавиатур

ВНИМАНИЕ: Проблемы с ALT + F + P (и другими методами)

Этот компьютер, быстрый доступ и другие специальные представления в проводнике являются реальной проблемой

Кажется, если вы откроете Windows Explorer\File Explorer и по умолчанию он откроет этот компьютер, то параметр « Открыть» в командной строке будет выделен серым цветом, и фактически нажатие клавиши P на этом этапе ничего не делает, если это так. Это кажется проблемой для других специальных представлений File Explorer, таких как Quick Access.

Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить

Как очистить командную строку

Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить

Как я могу исправить проблемы, связанные с shell.cmd?

Иногда ошибки SHELL.CMD и другие системные ошибки CMD могут быть связаны с проблемами в реестре Windows. Несколько программ может использовать файл SHELL.CMD, но когда эти программы удалены или изменены, иногда остаются «осиротевшие» (ошибочные) записи реестра CMD.

В принципе, это означает, что в то время как фактическая путь к файлу мог быть изменен, его неправильное бывшее расположение до сих пор записано в реестре Windows. Когда Windows пытается найти файл по этой некорректной ссылке (на расположение файлов на вашем компьютере), может возникнуть ошибка SHELL.CMD. Кроме того, заражение вредоносным ПО могло повредить записи реестра, связанные с OpenLinux eServer 2.3. Таким образом, эти поврежденные записи реестра CMD необходимо исправить, чтобы устранить проблему в корне.

Редактирование реестра Windows вручную с целью удаления содержащих ошибки ключей SHELL.CMD не рекомендуется, если вы не являетесь специалистом по обслуживанию ПК. Ошибки, допущенные при редактировании реестра, могут привести к неработоспособности вашего ПК и нанести непоправимый ущерб вашей операционной системе. На самом деле, даже одна запятая, поставленная не в том месте, может воспрепятствовать загрузке компьютера!

В силу данного риска для упрощения процесса рекомендуется использовать программу для очистки реестра ОС. Программа для очистки реестра автоматизирует процесс поиска недопустимых записей реестра, отсутствующих ссылок на файлы (например, вызывающих ошибку SHELL.CMD) и неработающих ссылок в реестре. Перед каждым сканированием автоматически создается резервная копия с возможностью отмены любых изменений одним щелчком мыши, что обеспечивает защиту от возможности повреждения ПК.

Будучи серебряным партнером Microsoft, мы предоставляем программное обеспечение, которое поможет вам устранить следующие проблемы:

Предупреждение: Если вы не являетесь опытным пользователем ПК, мы НЕ рекомендуем редактирование реестра Windows вручную. Некорректное использование Редактора реестра может привести к серьезным проблемам и потребовать переустановки Windows. Мы не гарантируем, что неполадки, являющиеся результатом неправильного использования Редактора реестра, могут быть устранены. Вы пользуетесь Редактором реестра на свой страх и риск.

Перед тем, как вручную восстанавливать реестр Windows, необходимо создать резервную копию, экспортировав часть реестра, связанную с SHELL.CMD (например, OpenLinux eServer 2.3):

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

Мы не несем никакой ответственности за результаты действий, совершенных по инструкции, приведенной ниже — вы выполняете эти задачи на свой ​​страх и риск.

:/> TASKKILL — завершение процесса в Windows.

Windows XP https://www.theeldergeek.com/windows_xp_registry.htm

Windows 7 https://www.theeldergeek.com/windows_7/registry_edits_for_win7.htm

Windows Vista https://support.microsoft.com/kb/2688326 — LetMeFixItMyselfAlways

Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить

Как почистить реестр

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

Шаг 1. Нажать кнопку «Пуск» и найти в меню программу «Выполнить», запустив ее щелчком мыши.

Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить

Шаг 2. Набрать в запустившемся окне команду «regedit», и нажать «ОК».

Удаление папок через командную строку

Если вам нужно удалить папку через командную строку Windows, то указанные выше команды вам не помогут. Для удаления папок существует отдельная команда RD или RMDIR (сокращение от английского Remove Directory).

Команды RD и RMDIR являются синонимами и предназначены для удаления папок. Они могу принимать следующие параметры:

Например, для того чтобы удалить папку достаточно ввести команду RD и название папки.

Если папка содержит вложенные папки или файлы, то при ее удалении будет выведена ошибка».

Для решения этой проблемы к команде RD нужно добавить параметр «/s». В этом случае удаление проходит без проблем, но появляется запрос на подтверждение удаления.

Для того чтобы удаление дерева папок прошло без появления запроса на подтверждение к команде нужно добавить параметр «/q». В этом случае папка удаляется без лишних вопросов.

Также команда RD может принимать сразу несколько папок, для этого их нужно просто разделить пробелом. Например, если выполнить «rd 111 222», то за один раз можно удалить папки с названиями «111» и «222».

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

Комбинируя команды DEL и RD, можно создавать мощные скрипты для очистки и удаления папок в операционной системе Windows.

Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить

Удаление записей об автозагрузке

Многие, особенно известные программы, записывают в реестр ветви, связанные с собственной загрузкой, проведением обновлений, или иными подобными действиями при запуске ОС. Пользователь имеет возможность удаления подобных записей.

Шаг 1. Используя приведенный выше способ, раскрыть раздел до папки HKEY_LOCAL_MACHINESOFTWARE Microsoft Windows Current Version Run.

Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить

Шаг 2. Найти требуемые данные справа. Это ярлыки некоторых запускаемых файлов в автозагрузке.

Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить

Если сведений о принадлежности записей определенной программе у пользователя нет, или неизвестно конкретное их значение, можно поискать эти данные в Интернете, например, в Google, или использовать специальный сайт Process Library, расположенный по адресу https://www.processlibrary.com/en/.

Удаление файлов через командную строку

Если вам нужно удалить файл через командную строку, то для этого нужно использовать команду DEL или ERASE. Эти команды являются синонимами и работают одинаково. Вы можете получить подробную информацию об этих командах, если введете их в командную строку с параметром «/?».

:/> где в реестре хранится настройки экрана

Команда DEL (или ERASE) предназначена для удаления одного или нескольких файлов и может принимать следующие параметры:

Обычно, для того чтобы воспользоваться командной DEL нужно сначала перейти в папку, в которой находится файл для удаления, и после этого выполнить команду. Для того чтобы сменить диск нужно просто ввести букву диска и двоеточие. А для перемещения по папкам нужно использовать команду «CD».

После того как вы попали в нужную папку можно приступать к удалению файлов. Для этого просто введите команду DEL и название файла.

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

Если есть необходимость выполнить запрос на подтверждение удаления каждого их файлов, то к команде DEL нужно добавить параметр «/p». В этом случае в командной строке будет появляться запрос на удаление файла и пользователю нужно будет ввести букву «Y» для подтверждения.

Нужно отметить, что при использовании параметра «/a», отвечающие за атрибуты буквы нужно вводить через двоеточие. Например, для того чтобы удалить все файлы с атрибутом «только для чтения» и с расширением «txt» нужно ввести команду «del /F /A:R *.txt».

Аналогичным образом к команде DEL можно добавлять и другие параметры. Комбинируя их вы сможете создавать очень мощные команды для удаления файлов через командную строку Windows. Ниже мы приводим еще несколько примеров:

Очистка в контекстном меню диска

Для добавления в контекстное меню диска пункта Очистка диска воспользуйтесь твиком реестра:

Твик необходимо внести в REG-файл и импортировать в реестр, подробности здесь.

При выборе этого пункта будет запускаться очистка для выбранного диска.

Многие пользователи знают о встроенной утилите Windows 7, 8 и Windows 10 — Очистка диска (cleanmgr), позволяющей удалить разного рода временные файлы системы, а также некоторые системные файлы, которые не требуются для штатной работы ОС. Преимущества этой утилиты по сравнению с самыми разными программами для очистки компьютера — в том, что при ее использовании любой, даже начинающий пользователь, скорее всего, ничего не повредит в системе.

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

Некоторые материалы, которые могут быть полезны в данном контексте:

Очистить / очистить кеш DNS браузера

Большинство современных веб-браузеров имеют встроенный DNS-клиент для предотвращения повторяющихся запросов при каждом посещении веб-сайта.

Гугл Хром

Если это не сработает, попробуйте очистить кеш и файлы cookie.

Fire Fox

Чтобы очистить кеш DNS Firefox, выполните следующие действия:

Если это не сработает, попробуйте следующий метод и временно отключите кеш DNS.

Очистка бортового журнала — логи, баки, гиды и прочее

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

Команда для очистки этих файлов:

del /q /f /s %SYSTEMDRIVE%\*.logdel /q /f /s %SYSTEMDRIVE%\*.bakdel /q /f /s %SYSTEMDRIVE%\*.gid

Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить

Команда удалит все файлы по маске (*.log, *.bak, *.gid) на системном диске, включая подкаталоги системного диска.

Автоматическая очистка реестра

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

Как удалить предлагаемые URL-адреса и изменить ярлыки для новых страниц в Chrome

Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить

Ярлыки и предлагаемые URL-адреса являются одними из самых полезных функций браузера Google Chrome. В последнем случае они предоставляют пользователям быстрый способ вернуться к наиболее посещаемым или недавним сайтам без необходимости вводить весь веб-адрес. Они также позволяют пользователям вернуться к хранящимся в облаке документам и папкам Google Диска, просто набрав несколько слов.

Между тем ярлыки предлагают простой способ переходить к сайтам прямо из пользовательского интерфейса новой страницы без необходимости вводить текст. Но ни ярлыки, ни предлагаемые URL-адреса не обязательно идеальны.

Иногда сохраняются ярлыки сайтов, которые пользователь не хочет отображать каждый раз, когда открывает новую вкладку или окно. В том же ключе иногда сайты сохраняются для предложений, представленных Google в омнибоксе URL-адресов, которые пользователи предпочли бы там не находиться.

К счастью, Google предлагает средство от этого. И процесс изменения ярлыков и предложений довольно прост как на мобильных, так и на настольных платформах.

Удалите рекомендуемые веб-сайты из омнибокса URL-адресов Chrome

Теперь есть несколько способов, которыми Chrome отображает веб-сайты, которые могут быть интересны пользователю, в том числе через омнибокс URL. В частности, это предложения, которые появляются, когда пользователи начинают вводить слова в это поле – обычно в нижней части предложенных условий поиска. Но иногда по какой-то причине от них желательно избавиться.

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

Удаление предложений омнибокса URL на компьютере

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

Во-первых, пользователям необходимо ввести те буквы, которые обычно появляются в предложении. Как показано на изображениях, мы набрали «tem», что привело к появлению двух предложений. Они предназначались для конкретной покупки скейтборда, которую мы исследовали, и «временного» документа Google Drawings, который использовался для краткосрочного редактирования. В этом случае скейтборд – нежелательный результат, так как это был разовый поиск.

Затем, используя клавиши со стрелками на клавиатуре или мышь, нужно выделить нежелательное предложение.

Чтобы навсегда удалить предложение на рабочем столе, пользователи будут использовать одну из двух команд. На Windows, Linux или Mac, нажатие и удерживание клавиши «shift» перед нажатием «delete» приведет к удалению выбора.

Пользователям Chrome OS потребуется использовать другую команду в свете того факта, что на клавиатуре Chromebook нет клавиши «удалить». Вместо этого на Chromebook клавиши «alt» и «backspace» заменяют клавишу «delete». Поэтому необходимо нажимать клавиши «shift» и «alt». Затем нажатие «backspace» удалит предложение.

Удаление предложений омнибокса URL на мобильном устройстве

Удаление предложений из Chrome на мобильных платформах так же просто, как и на настольных платформах, но требует другого набора действий. Для мобильных устройств предложения можно удалить простым касанием и удержанием. А именно, пользователям необходимо найти нежелательное предложение, набрав несколько первых букв поискового запроса или сайта.

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

Chrome для Android автоматически предполагает, что длительное нажатие на нежелательную опцию – это попытка удалить подсказку. Итак, когда пользователи нажимают и удерживают эту опцию, появляется простое всплывающее окно с вопросом, нужно ли это делать. Нажатие «ОК» удалит предложение, а нажатие «Отмена» оставит его на месте.

Удалить или изменить предложения ярлыка новой страницы в Chrome

Еще один способ отображения в Chrome сайтов, которые могут заинтересовать пользователя, – это использование ярлыков, представленных в пользовательском интерфейсе новой страницы. А именно, это значки в форме круга, которые можно найти чуть ниже строки поиска на новой странице в браузере. Обычно они отображаются несколькими способами. Но по умолчанию они отображаются в зависимости от того, какие сайты посещаются чаще всего.

Также можно настроить параметры, по крайней мере, на рабочем столе, чтобы эти ярлыки вообще отображались.

И наоборот, на любой платформе пользователи могут более чем адаптировать их в соответствии со своими потребностями. Это в отличие от простого разрешения Google автоматически заполнять ярлыки на основе собственных алгоритмов. Действия, которые необходимо выполнить, зависят от того, используется ли версия Chrome для настольных ПК или мобильная версия. Но в любом случае шаги просты и легки.

Удалить или изменить предложения ярлыков на рабочем столе

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

Переход к «Ярлыкам» через левую боковую панель показывает варианты ярлыков. По умолчанию, конечно же, выбраны «Наиболее посещаемые сайты», которые курирует непосредственно Google. Это основано на сайтах, наиболее часто посещаемых пользователями. Также есть возможность полностью отключить ярлыки.

Третий и последний вариант слева называется «Мои ярлыки» и позволяет пользователям устанавливать свои собственные, о чем мы скоро поговорим.

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

Щелчок или нажатие на это вызовет отдельное меню, которое позволяет отредактировать или полностью удалить ярлык. Кнопка удаления находится в нижнем левом углу меню редактирования. Здесь также можно изменить URL-адрес и описание ярлыка.

Чтобы получить более прямой контроль над ярлыками, при выборе «Мои ярлыки» пользователям просто нужно нажать или щелкнуть кнопку «Плюс» с надписью «Добавить ярлык».

Оттуда пользователям предоставляется пустое меню «Добавить ярлык», в которое нужно ввести имя сайта и URL-адрес. После выбора кнопки «Готово» в правом нижнем углу пользовательского интерфейса этот ярлык будет добавлен и появится на странице по умолчанию.

Удалить или изменить предложения ярлыков на мобильном устройстве

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

На iOS и Android пользователи по-прежнему могут в определенной степени изменять свои отображаемые ярлыки в Chrome. Если говорить более кратко, эти ярлыки можно удалить. Google Chrome для мобильных устройств автоматически заполнит пустое пространство новыми предложенными ярлыками. На данный момент нет простого способа полностью удалить их.

С учетом сказанного, удалить ярлыки так же просто, как нажать и удерживать данный ярлык. На изображениях выше мы выбрали ярлык «Walgreens» для удаления. При длительном нажатии открывается меню с несколькими опциями. Последняя показанная опция помечена как «Удалить».

Нажатие «Удалить» будет делать то, что указано в опции. Он удалит этот ярлык из пользовательского интерфейса новой страницы на мобильном устройстве.

Как я могу удалить символическую ссылку?

Будь очень осторожен.

Если у вас есть символическая ссылка, которая является каталогом (сделанным с помощью mklink /d ), то при использовании del будет удален все файлы в целевом каталоге (каталоге, на который указывает ссылка), а не только ссылка.

РЕШЕНИЕ: rmdir с другой стороны, удаляется только ссылка на каталог, а не то, на что указывает ссылка.

Для удаления символьных ссылок каталога, созданных с mklink /d его помощью, можно просто удалить символическую ссылку в проводнике.

Есть еще одно решение, проверенное мной и безопасное для использования. просто добавьте в реальную папку _ (пример: foo становитесь foo_), затем просто удалите ссылку Symbolik, затем удалите _ из вашей настоящей папки.

mklink нельзя использовать для удаления символических ссылок. Чтобы удалить символическую ссылку, просто удалите их, как будто вы удаляете обычный файл. Например, чтобы удалить созданную выше символическую ссылку foo, введите следующую команду:

Если ссылка является жесткой ссылкой на каталог:

или, если ссылка указывает на файл (в отличие от каталога)

В моем случае (Windows 10) после создания символической ссылки используется

Что вы должны сделать, это удалить ссылку через командную строку.

МЕТОД 1

Создайте его, используя контекстное меню, как показано, и удалите через проводник.

Протестируйте с помощью папки, C:\Windows\Logs как показано на рисунке или аналогичной. Я просто создаю каталог всех возможных местоположений временных файлов для удаления, и я хотел центральную папку, где я мог бы контролировать размер их через символические ссылки.

Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить

МЕТОД 2

На созданной символической ссылке ( в шагах, показанных выше ) щелкните правой кнопкой мыши на этот раз и выберите Свойства, затем перейдите на Link Properties вкладку.

Примечание. Это расширение оболочки добавило эту вкладку.

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

Вот прежде с целью как C:\Windows\Logs Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить

Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить

Вы можете проверить это еще раз, выполнив те же 1-3 шага выше, чтобы убедиться, что он застрял, на этот раз вы получите сообщение об ошибке при нажатии на Link Properties вкладку, поэтому ссылка теперь не работает.

Теперь безопасно (r) удалить символическую ссылку, чем метод 1 ИМХО.

Но! Оба метода работают здесь, так что это полностью зависит от выбора пользователя. Мне нравится метод свойств, на который я случайно наткнулся, так что вы на 100% уверены, что ссылка разорвана с помощью шага 4 выше.

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

Чтобы удалить, просто выполните шаги 1-5 выше метода 2 или выполните метод 1.

Как создать и удалить символическую ссылку, используя метод свойств

Как добавить контекстное меню «открыть git-bash здесь. » в проводник Windows?

Как добавить контекстное меню (также известное как щелчок правой кнопкой мыши) в проводник Windows, при нажатии которого открывается консоль git-bash в текущей папке проводника?

Шаг 2. Щелкните файл правой кнопкой мыши и выберите «Редактировать».

Шаг 3. Скопируйте и вставьте приведенный ниже код, сохраните и закройте файл.

Шаг 4. Запустите файл, дважды щелкнув его

Примечание. Вам необходимо разрешение администратора для записи в реестр.

И вот ваш результат:

Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить

У меня была аналогичная проблема, и я сделал это.

Шаг 2: Запустите редактор реестра

Шаг 4: Щелкните правой кнопкой мыши «оболочку» и выберите «Создать» > «Ключ». назовите ключ «Bash»

Шаг 5: Измените значение и установите для него значение «открыть в Bash». Это текст, который появляется при щелчке правой кнопкой мыши.

Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить

Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить

Шаг 6: Создайте новый ключ в Bash и назовите его «команда». Установите значение этого ключа на ваш путь к git-bash.exe.

Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить

Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить

Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить

Закройте редактор реестра.

Теперь вы должны увидеть эту опцию в меню правой кнопки мыши в проводнике.

PS Git Bash по умолчанию подхватывает текущую директорию.

РЕДАКТИРОВАТЬ : Если вам нужен подход в один клик, проверьте решение Ozesh ниже

Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить

Когда вы закончите, вы получите эти параметры, когда щелкнете правой кнопкой мыши по любой папке.

Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить

Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить

Вот экспорт реестра ( *.reg файлы) для Git GUI и Git Bash непосредственно из установщика Windows — Git GUI:

Вы можете установить git для Windows или Github для Windows, оба дают вам возможность при установке добавить эту функцию в проводник Windows. Вы можете найти это здесь:

Гитхаб для Windows

Гит для Windows

У меня сработало почти так, но со следующим путем REGEDIT:
HKEY_LOCAL_MACHINE/SOFTWARE/Classes/Directory/background/shell и здесь я создал ключ Bash со значением, которое я хочу, чтобы отображаемое имя было, а затем создал другой ключ под этой именованной командой со значением как путь к git-bash.exe

У меня Windows 10, и у меня есть новая установка git, которая по какой-то причине не добавила это автоматически (версия git 2.12.0 64bit)

Как сказал @Shaswat Rungta: «Я думаю, что вопрос больше в том, как добавить его после завершения установки».

На моем ПК (Windows 7) я думаю, что команда «Git Bash здесь» исчезла после того, как я установил Visual Studio 2017.

Я исправил это, снова загрузив и установив Git.

ПРИМЕЧАНИЕ. «При установке Git для Windows параметры контекстного меню не включены по умолчанию. Вам нужно будет выбрать их во время установки». – @nbushnell ( я сделал это )

Была похожая проблема при добавлении «Запустить командную строку с Ruby» в контекстное меню, поскольку она включает передачу параметров вместе с патчем cmd. Выполнил аналогичную процедуру, как решение выше

Обычно git bash here можно запускать только в каталогах, поэтому вам нужно перейти в каталог и щелкнуть правой кнопкой мыши предыдущий каталог, а затем выбрать git bash here (конечно, в ОС Windows).
Примечание : контекстное меню внутри каталога не имеет git bash here опций.

Когда вы устанавливаете git-scm, найденный в «https://git-scm.com/downloads», снимите флажок «Показывать только новые параметры», расположенный в самом низу окна установки.

Убедитесь, что вы проверяете

Нажмите «Далее», и все готово!

Вы можете установить TortoiseGit для Windows и включить интеграцию в контекстное меню. Я считаю его лучшим инструментом для работы с Git в Windows.

Я обновил свой git и отметил вариант «Git Bash Here».

Ярлык ссылка на url directory shell cmd как удалить. Смотреть фото Ярлык ссылка на url directory shell cmd как удалить. Смотреть картинку Ярлык ссылка на url directory shell cmd как удалить. Картинка про Ярлык ссылка на url directory shell cmd как удалить. Фото Ярлык ссылка на url directory shell cmd как удалить

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

Хотя есть исключения, это работает в большинстве случаев, включая, среди прочего, интерфейс командной строки 7-zip, отдельные инструменты командной строки SysInternals, интерфейс командной строки NuGet и многие другие.

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

Команды Windows

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

Оболочки командной строки
В Windows есть две оболочки командной строки: командная оболочка и PowerShell. Каждая оболочка представляет собой программное обеспечение, которое обеспечивает прямую связь между вами и операционной системой или приложением, обеспечивая среду для автоматизации ИТ-операций.

Командная оболочка была первой оболочкой, встроенной в Windows для автоматизации рутинных задач, таких как управление учетными записями пользователей или ночные резервные копии, с помощью пакетных файлов (.bat). С помощью Windows Script Host вы можете запускать более сложные сценарии в командной оболочке. Дополнительные сведения см. в разделах cscript или wscript. Вы можете выполнять операции более эффективно с помощью сценариев, чем с помощью пользовательского интерфейса. Скрипты принимают все команды, доступные в командной строке.

PowerShell был разработан для расширения возможностей командной оболочки для выполнения команд PowerShell, называемых командлетами. Командлеты похожи на команды Windows, но предоставляют более расширяемый язык сценариев. В PowerShell можно запускать как команды Windows, так и командлеты PowerShell, но командная оболочка может запускать только команды Windows, а не командлеты PowerShell.

Для наиболее надежной и современной автоматизации Windows мы рекомендуем использовать PowerShell вместо Windows Commands или Windows Script Host для автоматизации Windows.

Ссылки на коды выхода и ошибок для команд Windows можно найти в статьях Коды ошибок системы отладки, которые могут быть полезны для понимания возникающих ошибок. Команды Windows также включают операторы перенаправления команд. Чтобы узнать больше об их использовании, см. раздел Использование операторов перенаправления команд.

Примечание

Вы также можете загрузить и установить PowerShell Core, версию PowerShell с открытым исходным кодом.

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

Осторожность

Неправильное редактирование реестра может серьезно повредить вашу систему. Прежде чем вносить следующие изменения в реестр, вы должны создать резервную копию всех ценных данных на компьютере.


Копировать
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Командный процессор\CompletionChar
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Командный процессор\PathCompletionChar

Копировать
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Командный процессор\CompletionChar
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Командный процессор\PathCompletionChar
Установите для этих значений значение управляющего символа, который вы хотите использовать. Полный список смотрите в разделе Коды виртуальных ключей. Чтобы отключить определенный символ завершения в реестре, используйте значение для пробела (0x20), поскольку он не является допустимым управляющим символом. Тип значения для этой записи реестра — REG_DWORD, и может быть задан шестнадцатеричным или десятичным значением.

Вы также можете включить или отключить завершение имен файлов и каталогов для каждого экземпляра командной оболочки, выполнив cmd.exe с параметром и переключите /F:ВКЛ. или /F:ВЫКЛ. Если завершение имени включено с помощью параметра и переключателя /F:ON, используются два управляющих символа: Ctrl-D для завершения имени каталога и Ctrl-F для завершения имени файла. Параметры, заданные пользователем, имеют приоритет над настройками компьютера, а параметры командной строки имеют приоритет над параметрами реестра.

Ссылка на командную строку A-Z
Чтобы найти информацию о конкретной команде, в следующем меню от А до Я выберите букву, с которой начинается команда, а затем выберите имя команды.

A
active
add
add alias
add volume
append
arp
assign
assoc
at
atmadm
attach-vdisk
attrib
attributes
attributes disk
attributes volume
auditpol
auditpol backup
auditpol clear
auditpol get
auditpol list
auditpol remove
auditpol resourcesacl
auditpol restore
auditpol set
autochk
autoconv
autofmt
automount
B
bcdboot
bcdedit
bdehdcfg
bdehdcfg driveinfo
bdehdcfg newdriveletter
bdehdcfg quiet
bdehdcfg restart
bdehdcfg size
bdehdcfg target
begin backup
begin restore
bitsadmin
bitsadmin addfile
bitsadmin addfileset
bitsadmin addfilewithranges
bitsadmin cache
bitsadmin cache and delete
bitsadmin cache and deleteurl
bitsadmin cache and getexpirationtime
bitsadmin cache and getlimit
bitsadmin cache and help
bitsadmin cache and info
bitsadmin cache and list
bitsadmin cache and setexpirationtime
bitsadmin cache and setlimit
bitsadmin cache and clear
bitsadmin cancel
bitsadmin complete
bitsadmin create
bitsadmin examples
bitsadmin getaclflags
bitsadmin getbytestotal
bitsadmin getbytestransferred
bitsadmin getclientcertificate
bitsadmin getcompletiontime
bitsadmin getcreationtime
bitsadmin getcustomheaders
bitsadmin getdescription
bitsadmin getdisplayname
bitsadmin geterror
bitsadmin geterrorcount
bitsadmin getfilestotal
bitsadmin getfilestransferred
bitsadmin gethelpertokenflags
bitsadmin gethelpertokensid
bitsadmin gethttpmethod
bitsadmin getmaxdownloadtime
bitsadmin getminretrydelay
bitsadmin getmodificationtime
bitsadmin getnoprogresstimeout
bitsadmin getnotifycmdline
bitsadmin getnotifyflags
bitsadmin getnotifyinterface
bitsadmin getowner
bitsadmin getpeercachingflags
bitsadmin getpriority
bitsadmin getproxybypasslist
bitsadmin getproxylist
bitsadmin getproxyusage
bitsadmin getreplydata
bitsadmin getreplyfilename
bitsadmin getreplyprogress
bitsadmin getsecurityflags
bitsadmin getstate
bitsadmin gettemporaryname
bitsadmin gettype
bitsadmin getvalidationstate
bitsadmin help
bitsadmin info
bitsadmin list
bitsadmin listfiles
bitsadmin makecustomheaderswriteonly
bitsadmin monitor
bitsadmin nowrap
bitsadmin peercaching
bitsadmin peercaching and getconfigurationflags
bitsadmin peercaching and help
bitsadmin peercaching and setconfigurationflags
bitsadmin peers
bitsadmin peers and clear
bitsadmin peers and discover
bitsadmin peers and help
bitsadmin peers and list
bitsadmin rawreturn
bitsadmin removeclientcertificate
bitsadmin removecredentials
bitsadmin replaceremoteprefix
bitsadmin reset
bitsadmin resume
bitsadmin setaclflag
bitsadmin setclientcertificatebyid
bitsadmin setclientcertificatebyname
bitsadmin setcredentials
bitsadmin setcustomheaders
bitsadmin setdescription
bitsadmin setdisplayname
bitsadmin sethelpertoken
bitsadmin sethelpertokenflags
bitsadmin sethttpmethod
bitsadmin setmaxdownloadtime
bitsadmin setminretrydelay
bitsadmin setnoprogresstimeout
bitsadmin setnotifycmdline
bitsadmin setnotifyflags
bitsadmin setpeercachingflags
bitsadmin setpriority
bitsadmin setproxysettings
bitsadmin setreplyfilename
bitsadmin setsecurityflags
bitsadmin setvalidationstate
bitsadmin suspend
bitsadmin takeownership
bitsadmin transfer
bitsadmin util
bitsadmin util and enableanalyticchannel
bitsadmin util and getieproxy
bitsadmin util and help
bitsadmin util and repairservice
bitsadmin util and setieproxy
bitsadmin util and version
bitsadmin wrap
bootcfg
bootcfg addsw
bootcfg copy
bootcfg dbg1394
bootcfg debug
bootcfg default
bootcfg delete
bootcfg ems
bootcfg query
bootcfg raw
bootcfg rmsw
bootcfg timeout
break
C
cacls
call
cd
certreq
certutil
change
change logon
change port
change user
chcp
chdir
chglogon
chgport
chgusr
chkdsk
chkntfs
choice
cipher
clean
cleanmgr
clip
cls
cmd
cmdkey
cmstp
color
comp
compact
compact vdisk
convert
convert basic
convert dynamic
convert gpt
convert mbr
copy
cprofile
create
create partition efi
create partition extended
create partition logical
create partition msr
create partition primary
create volume mirror
create volume raid
create volume simple
create volume stripe
cscript
D
date
dcgpofix
defrag
del
delete
delete disk
delete partition
delete shadows
delete volume
detach vdisk
detail
detail disk
detail partition
detail vdisk
detail volume
dfsdiag
dfsdiag testdcs
dfsdiag testdfsconfig
dfsdiag testdfsintegrity
dfsdiag testreferral
dfsdiag testsites
dfsrmig
diantz
dir
diskcomp
diskcopy
diskpart
diskperf
diskraid
diskshadow
dispdiag
dnscmd
doskey
driverquery
E
echo
edit
endlocal
end restore
erase
eventcreate
eventquery
eventtriggers
Evntcmd
exec
exit
expand
expand vdisk
expose
extend
extract
F
fc
filesystems
find
findstr
finger
flattemp
fondue
for
forfiles
format
freedisk
fsutil
fsutil 8dot3name
fsutil behavior
fsutil dirty
fsutil file
fsutil fsinfo
fsutil hardlink
fsutil objectid
fsutil quota
fsutil repair
fsutil reparsepoint
fsutil resource
fsutil sparse
fsutil tiering
fsutil transaction
fsutil usn
fsutil volume
fsutil wim
ftp
ftp append
ftp ascii
ftp bell
ftp binary
ftp bye
ftp cd
ftp close
ftp debug
ftp delete
ftp dir
ftp disconnect
ftp get
ftp glob
ftp hash
ftp lcd
ftp literal
ftp ls
ftp mget
ftp mkdir
ftp mls
ftp mput
ftp open
ftp prompt
ftp put
ftp pwd
ftp quit
ftp quote
ftp recv
ftp remotehelp
ftp rename
ftp rmdir
ftp send
ftp status
ftp trace
ftp type
ftp user
ftp verbose
ftp mdelete
ftp mdir
ftype
fveupdate
G
getmac
gettype
goto
gpfixup
gpresult
gpt
gpupdate
graftabl
H
help
helpctr
hostname
I
icacls
if
import (shadowdisk)
import (diskpart)
inactive
inuse
ipconfig
ipxroute
irftp
J
jetpack
K
klist
ksetup
ksetup addenctypeattr
ksetup addhosttorealmmap
ksetup addkdc
ksetup addkpasswd
ksetup addrealmflags
ksetup changepassword
ksetup delenctypeattr
ksetup delhosttorealmmap
ksetup delkdc
ksetup delkpasswd
ksetup delrealmflags
ksetup domain
ksetup dumpstate
ksetup getenctypeattr
ksetup listrealmflags
ksetup mapuser
ksetup removerealm
ksetup server
ksetup setcomputerpassword
ksetup setenctypeattr
ksetup setrealm
ksetup setrealmflags
ktmutil
ktpass
L
label
list
list providers
list shadows
list writers
load metadata
lodctr
logman
logman create
logman create alert
logman create api
logman create cfg
logman create counter
logman create trace
logman delete
logman import and logman export
logman query
logman start and logman stop
logman update
logman update alert
logman update api
logman update cfg
logman update counter
logman update trace
logoff
lpq
lpr
M
macfile
makecab
manage bde
manage bde status
manage bde on
manage bde off
manage bde pause
manage bde resume
manage bde lock
manage bde unlock
manage bde autounlock
manage bde protectors
manage bde tpm
manage bde setidentifier
manage bde forcerecovery
manage bde changepassword
manage bde changepin
manage bde changekey
manage bde keypackage
manage bde upgrade
manage bde wipefreespace
mapadmin
md
merge vdisk
mkdir
mklink
mmc
mode
more
mount
mountvol
move
mqbkup
mqsvc
mqtgsvc
msdt
msg
msiexec
msinfo32
mstsc
N
nbtstat
netcfg
netdom
net print
netsh
netstat
nfsadmin
nfsshare
nfsstat
nlbmgr
nltest
nslookup
nslookup exit Command
nslookup finger Command
nslookup help
nslookup ls
nslookup lserver
nslookup root
nslookup server
nslookup set
nslookup set all
nslookup set class
nslookup set d2
nslookup set debug
nslookup set domain
nslookup set port
nslookup set querytype
nslookup set recurse
nslookup set retry
nslookup set root
nslookup set search
nslookup set srchlist
nslookup set timeout
nslookup set type
nslookup set vc
nslookup view
ntbackup
ntcmdprompt
ntfrsutl
O
offline
offline disk
offline volume
online
online disk
online volume
openfiles
P
pagefileconfig
path
pathping
pause
pbadmin
pentnt
perfmon
ping
pktmon
pnpunattend
pnputil
popd
powershell
powershell ise
print
prncnfg
prndrvr
prnjobs
prnmngr
prnport
prnqctl
prompt
pubprn
pushd
pushprinterconnections
pwlauncher
pwsh
Q
qappsrv
qprocess
query
query process
query session
query termserver
query user
quser
qwinsta
R
rcp
rd
rdpsign
recover
recover disk group
refsutil
reg
reg add
reg compare
reg copy
reg delete
reg export
reg import
reg load
reg query
reg restore
reg save
reg unload
regini
regsvr32
relog
rem
remove
ren
rename
repadmin
repair
repair bde
replace
rescan
reset
reset session
retain
revert
rexec
risetup
rmdir
robocopy
route ws2008
rpcinfo
rpcping
rsh
rundll32
rundll32 printui
rwinsta
S
san
sc config
sc create
sc delete
sc query
schtasks
scwcmd
scwcmd analyze
scwcmd configure
scwcmd register
scwcmd rollback
scwcmd transform
scwcmd view
secedit
secedit analyze
secedit configure
secedit export
secedit generaterollback
secedit import
secedit validate
select
select disk
select partition
select vdisk
select volume
serverceipoptin
servermanagercmd
serverweroptin
set environmental variables
set shadow copy
set context
set id
setlocal
set metadata
set option
set verbose
setx
sfc
shadow
shift
showmount
shrink
shutdown
simulate restore
sort
start
subcommand set device
subcommand set drivergroup
subcommand set drivergroupfilter
subcommand set driverpackage
subcommand set image
subcommand set imagegroup
subcommand set server
subcommand set transportserver
subcommand set multicasttransmission
subcommand start namespace
subcommand start server
subcommand start transportserver
subcommand stop server
subcommand stop transportserver
subst
sxstrace
sysocmgr
systeminfo
T
takeown
tapicfg
taskkill
tasklist
tcmsetup
telnet
telnet close
telnet display
telnet open
telnet quit
telnet send
telnet set
telnet status
telnet unset
tftp
time
timeout
title
tlntadmn
tpmtool
tpmvscmgr
tracerpt
tracert
tree
tscon
tsdiscon
tsecimp
tskill
tsprof
type
typeperf
tzutil
U
unexpose
uniqueid
unlodctr
V
ver
verifier
verify
vol
vssadmin
vssadmin delete shadows
vssadmin list shadows
vssadmin list writers
vssadmin resize shadowstorage
W
waitfor
wbadmin
wbadmin delete catalog
wbadmin delete systemstatebackup
wbadmin disable backup
wbadmin enable backup
wbadmin get disks
wbadmin get items
wbadmin get status
wbadmin get versions
wbadmin restore catalog
wbadmin start backup
wbadmin start recovery
wbadmin start sysrecovery
wbadmin start systemstatebackup
wbadmin start systemstaterecovery
wbadmin stop job
wdsutil
wecutil
wevtutil
where
whoami
winnt
winnt32
winpop
winrs
winsat mem
winsat mfmedia
wmic
writer
wscript
X
xcopy

Shell-Cmd-3.04 

Shell::Cmd

имя
Shell::Cmd — запуск команд оболочки с расширенной поддержкой

КРАТКОЕ
ОПИСАНИЕ используйте use Shell::Cmd;

$obj = new Shell::Cmd;
описание
Очень распространенное использование perl заключается в том, чтобы действовать как оболочка вокруг команд оболочки, где perl используется для подготовки команд оболочки, их выполнения и обработки результирующего вывода. Даже там, где основная часть работы фактически выполняется в скрипте perl, создание небольших сценариев оболочки внутри него для выполнения некоторой части задачи является обычным делом.

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

Этот модуль предназначен для получения списка команд оболочки и автоматического преобразования их в сценарий оболочки (используя только базовые команды оболочки, доступные в любом варианте оболочки bourne), который добавляет некоторые общие желательные функции, включая:

Обрабатывать STDOUT/STDERR
Обычно я хочу каким-то образом обработать STDOUT и STDERR. Возможно, я захочу сохранить один или оба из них, или отказаться от одного или обоих из них, или объединить их.

Повторение команды
Распространенный параметр, который я хочу установить, — это повторение команд, при котором команды, которые я выполняю, повторяются по мере их выполнения. Я хочу иметь возможность легко включать или выключать это (обычно с помощью опции командной строки в вызывающем скрипте).

Сухой ход
Другим распространенным вариантом является создание среды «сухого запуска», в которой команды оболочки могут быть напечатаны, но фактически не выполняться. Опять же, я хочу иметь возможность легко включать и выключать это.

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

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

Среда оболочки
Иногда я хочу настроить некоторую среду для скрипта, например, в каком каталоге он будет выполняться и какие переменные среды должны быть установлены заранее.

Чередование команд
Иногда, особенно если вы запускаете скрипт на нескольких платформах, вы можете не знать, какую команду следует использовать. Конечно, вы можете сгенерировать скрипт для конкретной платформы, но альтернативой является указание альтернативных команд. Если КАКАЯ-либо из этих команд выполняется успешно, то эта часть скрипта выполняется успешно.

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

Удаленное выполнение
Иногда вы хотите запускать команды локально. В других случаях вы хотите запустить его удаленно, используя ssh. При удаленном запуске может потребоваться запустить один и тот же сценарий на нескольких хостах.

Обработка SSH
При запуске на нескольких хостах с использованием SSH иногда вам нужно запускать скрипт последовательно (т.е. по одному хосту за раз), но в других случаях было бы неплохо запускать его параллельно, чтобы ускорить выполнение. При параллельном запуске вы должны иметь возможность указать, сколько экземпляров нужно запускать одновременно.

Кавычки и специальные символы
Поскольку команды оболочки часто содержат кавычки, знаки доллара и другие специальные символы, этот модуль может справиться с этим за вас, правильно экранируя их по мере необходимости.

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

МЕТОДЫ
новые
$obj = новая оболочка::Cmd;
Это создает новый объект, содержащий команды.

версия
$vers = $obj->версия();
Возвращает версию этого модуля.

cmd
$err = $obj->cmd($cmd [,\%options], $cmd [,\%options], …);
Это используется для добавления одной или нескольких команд в список команд, которые будут выполняться.

Здесь каждый $cmd представляет собой либо строку, содержащую команду, либо listref, где каждый элемент в списке представляет собой строку, содержащую команду.

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

Например, если вы хотите запустить команду для получения содержимого веб-сайта, и вы не знаете, какие из curl, wget или lftp доступны, вы можете использовать что-то вроде этого:

$err = $obj->cmd([«wget $URL», «curl $URL», «lftp $URL»]);
и в этом случае он попробует wget, и если это не удастся, он попробует curl, а если это не удастся, он попробует lftp. Команда завершится неудачей только в том случае, если все три альтернативных варианта завершатся неудачей.

Каждая команда (или список альтернативных вариантов) может иметь переданные параметры. Эти параметры применимы только к этой команде (или списку) и описаны в разделе «ПАРАМЕТРЫ для КАЖДОЙ КОМАНДЫ» ниже.

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

Если какой-либо из аргументов неверен, возвращается ошибка.

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

Если используются только простые списки команд, обработка их относительно проста, но попытка включить команды, которые влияют на ход выполнения скрипта (например, while …done, if …else и тому подобное), тогда обработка может быть намного сложнее. Обратитесь к разделу «КОМАНДЫ ПОТОКА» ниже. Определение функций не поддерживается.

бежать
$ret = $obj->выполнить();
Это подготавливает сценарий командной оболочки на основе введенных команд и параметров и запускает его соответствующим образом. Сценарий хранится во временном файле, который можно настроить с помощью параметра tmp_script (см. раздел «ГЛОБАЛЬНЫЕ ПАРАМЕТРЫ» ниже).

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

Если режим запущен, метод вызывается как:

$err = $obj->выполнить();
В этом режиме выполняется сценарий, и выходные данные отправляются непосредственно в STDOUT и STDERR в соответствии с указанными параметрами. По сути, это генерирует сценарий и запускает его с помощью вызова system().

Возвращаемый код ошибки описан ниже в разделе «КОДЫ ОШИБОК».

В режиме сухого запуска метод вызывается как:

$script = $obj->выполнить();
В этом режиме команды фактически не выполняются. Вместо этого сценарий создается и возвращается. Форма скрипта определяется параметром скрипта, описанным ниже.

В режиме сценария метод вызывается как:

$err = $obj->выполнить();
В этом случае выходные данные команд сохраняются для дальнейшего анализа. Затем метод $obj-output(…)> может быть использован для проверки результирующего вывода.

Коды ошибок описаны в разделе «КОДЫ ошибок» ниже.

тсс
Это ведет себя аналогично методу run, за исключением того, что он будет запускать команды на каждом хосте в @hosts с использованием ssh. Возвращаемые значения для каждого режима идентичны методам возврата из метода run, за исключением того, что как для режима run, так и для режима script выходные данные возвращаются в виде хэша, где ключами являются хосты, а значениями — значение для этого хоста.

Например, в режиме выполнения вызов будет:

%err = $obj->ssh(@hosts)
В режиме сухого запуска вызов идентичен методу run, и он вернет сценарий, который будет выполняться на каждом хосте.

$script = $obj->ssh(@hosts);
Обратите внимание, что при параллельной работе в режиме выполнения выходные данные, которые выводятся на терминал, будут представлять собой смесь выходных данных с каждого из хостов, на которых выполняются команды.

выход
$ret = $obj->вывод(%опций);
@ret = $obj->вывод(%параметров);
%ret = $obj->вывод(%опций);
Это вернет выходные данные, полученные при выполнении команд в режиме скрипта, в зависимости от переданных параметров.

Аргумент %options описан ниже в разделе ПАРАМЕТРЫ ВЫВОДА.

промывать
$obj->сброс( [@opts] );
Если @opts не задан, он удаляет все данные, хранящиеся в объекте, сбрасывая его на чистый объект. Если задано значение @opts, вы можете очистить определенные части объекта. Может быть предоставлен любой из следующих вариантов:

команды : очищает все команды и их параметры
env : очищает среду
opts : очищает все параметры
out : очищает вывод от выполнения команды
в режиме B<script> .

$err = $obj->dire($dire);
Этот метод используется для установки параметра dire. Для получения описания, пожалуйста, ознакомьтесь с записью в разделе «ГЛОБАЛЬНЫЕ ПАРАМЕТРЫ» ниже. Это кратчайший путь для:

$err = $obj->параметры(‘dire’,$dire);
Вы также можете проверить значение, заданное с помощью:

$dire = $obj->dire();
режим
$err = $obj->режим($mode);
Этот метод используется для установки параметра mode. Для получения описания, пожалуйста, ознакомьтесь с записью в разделе «ГЛОБАЛЬНЫЕ ПАРАМЕТРЫ» ниже. Это кратчайший путь для:

$err = $obj->параметры(‘mode’,$dire);
Вы также можете проверить значение, заданное с помощью:

$mode = $obj->mode();
env
$obj->env($var1, $val1, $var2, $val2, …);
Это можно вызвать любое количество раз, чтобы установить некоторые переменные среды. Если значение $val равно undef, переменная среды будет явно не установлена.

Основы Windows
CMD Shell и другие
Для начинающих прочтите «Руководство по выживанию программиста для Windows — Файловая система и командная оболочка».

1. Часто используемые команды
Общие примечания: Команды НЕ чувствительны к регистру (поскольку устаревшая DOS не чувствительна к регистру). Как правило, операционная система Windows / DOS не чувствительна к регистру, но Unix — это так. Большинство языков программирования, таких как C/C++/Java, происхождение которых происходит из Unix, чувствительны к регистру.

1.1 Помощь
Справка: Чтобы перечислить все доступные команды, например,

Подсказка> справка
Для получения дополнительной информации о конкретной команде введите HELP command-name
ASSOC Отображает или изменяет ассоциации расширений файлов.
ATTRIB Отображает или изменяет атрибуты файла.
BREAK Устанавливает или снимает расширенную проверку CTRL+C.
……
Чтобы получить дополнительную информацию о конкретной команде, введите «имя команды справки», например,

Приглашение> компакт-диск со справкой
Отображает имя текущего каталога или изменяет его.
…….
1.2 Команды, связанные с каталогами и файлами
Директорияструктура.png
Операционная система Windows упорядочивает файлы по диску и каталогу. Диск идентифицируется буквой, за которой следует двоеточие, e, g,. «C:», «D:» и «I:». (В Unix нет понятия диска.) Каталог имеет древовидную структуру, начинающуюся с так называемого корневого каталога, обозначаемого косой чертой ‘\’. Каждый каталог может содержать подкаталоги или файлы. Подкаталоги могут содержать подкаталоги или файлы. Подкаталоги разделяются обратной косой чертой ‘\’ (Unix использует прямую косую черту ‘/’ в качестве разделителя каталогов). Каталог также называется папкой или путем. Пример проиллюстрирован ниже:

В приведенном выше примере имя файла с полным путем для «Hello.java » есть «D:\java\beginner\Hello.java «, который начинается с буквы диска «D:», за которой следует корневой каталог «\», подкаталоги (разделенные символом «\») и имя файла. Имя файла состоит из двух частей, имени и расширения, разделенных точкой ‘.’. Расширение файла определяет тип файла (например, «.txt» для текстового файла, «.doc» для документа Word, «.java» для исходного файла Java), который может быть связан с программой обработки. (В Unix нет понятия расширения файла.)

Текущий диск и Текущий рабочий каталог (CWD) относятся к диску и каталогу, с которыми вы в данный момент работаете. Они отображаются как часть командной строки, предшествующей «>». Например,

D:\java\beginner >
В приведенном выше примере текущий диск — «D:», а текущий рабочий каталог — «\java\beginner».

Чтобы установить или изменить текущий диск, введите букву диска, за которой следует двоеточие, например,

C:\Users\john > D:
D:\> C:
C:\Users\john > D:
D:\> J:
Системе не удается найти указанный диск.
Измените текущий привод на D:
Измените текущий привод на C:
Измените текущий привод на D:
Измените текущий привод на J:
[сообщение об ошибке]
Чтобы установить или изменить текущий рабочий каталог, используйте команду cd (изменить каталог). Вы можете использовать «\» для ссылки на корневой каталог текущего диска, «..» для ссылки на родительский каталог и «.» для ссылки на текущий каталог. Вы можете использовать абсолютный путь, который начинается с корневого каталога (с начальной косой чертой), или относительный путь (без начальной косой черты), который относится к текущему рабочему каталогу. Для примеров,

C:\Users\john > D:
D:\> cd java
D:\java > компакт-диск для начинающих
D:\java\beginner > cd \java\advanced
D:\java\advanced > компакт — диск ..
D:\java > компакт-диск \
D:\> C:
C:\Users\john >
Измените текущий привод на D:
Измените каталог на «java», относительно корневого «\»
Измените каталог на «beginner» относительно «\java»
Измените каталог на «\java\advanced» (абсолютный)
Изменить каталог на родительский каталог (относительный)
Изменить каталог на корневой (абсолютный)
Измените текущий привод на C:
[в текущем рабочем каталоге диска C:]
Командный компакт-диск (без параметра) отображает текущий рабочий каталог.

Обратите внимание, что вы должны установить текущий диск и текущий рабочий каталог в двух отдельных операциях.

Вы можете использовать команду dir (каталог) для отображения содержимого текущего рабочего каталога. Для примеров,

D:\java\beginner >
объем каталога на диске D — Рабочий
объем, Серийный номер которого равен xxxx-xxxx

Справочник по D:\java\beginner

xx-xxx-xx xx:xx xx <РЕЖ .> .
xx-xxx-xx xx:xx xx <РЕЖ .> ..
xx-xxx-xx xx:xx xx 417 Hello.class
xx-xxx-xx xx:xx xx 118 Hello.java
2 Файла(файлов) 535 байт
2 Dir(ы) xx,xxx,xxx,xxx байт бесплатно
В выходных данных перечислены все подкаталоги и файлы, содержащиеся в текущем рабочем каталоге. Он также содержит две специальные записи: «..» для родительского каталога и «.» для текущего каталога.

Вы можете использовать специальные подстановочные знаки для фильтрации или сопоставления имен файлов. Подстановочный знак «*» соответствует нулю или более (любым) символам. Подстановочный знак «?» соответствует ровно одному (любому) символу. Для примеров,

Приглашение> каталог *.java
Подсказка> dir H*
Подсказка> режиссер Привет?.java
Список файлов, заканчивающихся на .java
Список файлов, начинающихся с «H»
Список файлов, начинающихся с Hello, за которыми следует любой (один) символ, заканчивающийся на .java
Другие часто используемые команды, связанные с каталогами и файлами, включают:

удаление имен файлов: Удаление файлов.
ren current-filename new-filename: Переименовывает файл.
mkdir directory-name: Создает (или создает) подкаталог в текущем рабочем каталоге.
имя каталога rmdir: Удаляет или удаляет подкаталог.
копировать имя файла new-имя файла: Копирует файл.
xcopy|robocopy: Копирует (или надежно копирует) файлы и деревья каталогов.
Вы можете ввести команду «help command-name», чтобы проверить синтаксис и параметры приведенных выше команд.

В качестве альтернативы вы можете использовать проводник Windows (Мой компьютер) для выполнения вышеуказанных задач в графическом виде.

1.3 Окружающая среда и локальные переменные
Переменные среды — это глобальные системные переменные, доступные всем процессам, запущенным в Операционной системе. Переменные среды полезны для хранения общесистемных значений, таких как каталоги для поиска исполняемых программ, версия ОС и расположение двоичных файлов Windows. (Реестр Windows был позже создан для более эффективного хранения постоянно растущих данных, необходимых для приложений.)

Процесс может получить доступ ко всем переменным среды, он также может поддерживать свои собственные локальные переменные, которые доступны только ему самому.

ПРОЧИТАЙТЕ РАЗДЕЛ «Как установить или изменить переменную».

1.4 Переменная окружения PATH
ПРОЧИТАЙТЕ «ПУТЬ (для пользователей Windows)».

1.5 Разные команды
cls (очистить экран): Очищает текущий экран и удаляет все сообщения.
введите имя файла: вводит (или отображает) содержимое файла.
1.6 Операторы перенаправления и команды фильтрации
По умолчанию вывод команды выводится на экран (называется STDOUT), а ввод команды осуществляется с клавиатуры (называется STDIN). Вы можете использовать оператор перенаправления для перенаправления ввода и вывода из/в файл или другую команду:

> (перенаправление вывода): Записывает выходные данные в файл (или на устройство, такое как принтер), а не на экран (STDOUT).
>> (перенаправление добавления вывода): Добавляет выходные данные в файл, а не на экран.
< (перенаправление ввода): Считывает ввод из файла или устройства, а не с клавиатуры (STDIN).
| (pipe): преобразует выходные данные одной команды во входные данные другой команды.
Перенаправитель вывода ‘>’ включает в себя программу и приемник (пункт назначения). Перенаправитель ввода ‘<‘ включает в себя программу и источник. Канал «|» включает в себя две программы.

Эти команды фильтрации работают с операторами перенаправления для указания входных и выходных данных:

найти строку: Поиск указанной строки.
сортировка: Сортировка строк в алфавитном порядке.
дополнительно: Отображение одного экрана за раз и ожидание нажатия клавиши для отображения следующего экрана. (Это было полезно в старые времена, когда вывод на экран не буферизовался, но сейчас я нахожу это раздражающим.)
Для примеров,

Подсказка> подробнее < abc.txt
Подсказка> найти «Привет» < abc.txt
Подсказка> найти «Привет» < abc.txt > out.txt
Подсказка> найти «Привет» < abc.txt | подробнее
Подсказка> сортировка < xyz.txt
Подсказка> найти «Джона» < xyz.txt | сортировать > out.txt
Отображение данного файла по одному экрану за раз.
Найдите указанную строку из данного файла.
Найдите указанную строку и запишите результаты в другой файл.
Выводите результат на один экран за раз.
Отсортируйте строки в алфавитном порядке, выведите на экран.
Найдите строку из файла, отсортируйте выходные данные, запишите результат в файл.
Примечания: Канал ‘|’ используется для передачи в другую команду (или процесс); перенаправление вывода ‘>’ используется для отправки выходных данных в файл (или устройство, такое как принтер) вместо STDOUT.

2. Подробнее о файловой системе Windows
2.1 Разрешения
[ЗАДАЧИ]

2.2 Символическая ссылка (SymLink)
В Windows Vista/7/8 вы можете создать символическую ссылку на файл или каталог (аналогично Unix) с помощью команды «mklink». Символическая ссылка может обеспечить большое удобство во многих ситуациях.

Вам нужна привилегия «Создать символическую ссылку» для выполнения команды «mklink», которой по умолчанию обладают только администраторы. Запустите командную оболочку CMD с правами администратора («запуск от имени администратора»), чтобы выполнить команду «mklink»..

> справка mklink

// Создайте символическую ссылку каталога с именем mysql на mysql-5.0.28-win32
> mklink /D mysql mysql-5.0.28-win32
символическая ссылка, созданная для mysql <<===>> mysql-5.0.28-win32

> реж
14.10.2012 12:45 <SYMLINKD> mysql [mysql-5.0.28-win32]
Символическая ссылка отличается от ярлыка, который был доступен в более ранних версиях Windows.

3. Язык командной оболочки и пакетные файлы
Пакетный файл (также называемый пакетной программой или сценарием оболочки) — это исполняемая программа, содержащая последовательность команд. Пакетный файл имеет расширение файла «.bat». Пакетные файлы, в которых используется устаревший язык сценариев, обладают очень простым, примитивным и неуклюжим синтаксисом. Для примеров,

Имена и идентификаторы не чувствительны к регистру.
Все переменные принадлежат типу string. Здесь нет числового типа и нет арифметических операций.

Unix shell: абсолютно первые шаги

Оболочки*
Tutorial
 

Зачем и для кого статья?

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

Здесь не будет пересказа манов (документации), и статья никак не отменяет и не заменяет их чтение. Вместо этого я расскажу о главных вещах (командах, приемах и принципах), которые надо осознать с самого начала работы в unix shell-е, чтобы работа происходила эффективно и приятно.

Статья касается полноценных unix-подобных окружений, с полнофункциональным шеллом (предпочтительно zsh или bash)и достаточно широким набором стандартных программ.

Что такое шелл

Shell (шелл, он же «командная строка», он же CLI, он же «консоль», он же «терминал», он же «черное окошко с белыми буковками») — это текстовый интерфейс общения с операционной системой (ну, строго говря, это программа, которая таковой интерфейс обеспечивает, но сейчас это различие несущественно).

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

Типичный вид шелла:
типичный вид шелла

Шелл — это основной способ для взаимодействия со всеми Unix-подобными серверными системами.

Где встречаются системы с командной строкой?

Где вас может поджидать unix-овый шелл, популярные варианты:

  • MacOS (bash);
  • удаленный доступ на сервер по работе или для личного веб-проекта;
  • домашний файл-сервер с удаленным доступом;
  • Ubuntu, PC-BSD на ноутбуке/десктопе — unix-подобные системы сегодня просты в установке и использовании.

Какие задачи разумно решать шеллом?

Естественные задачи, для которых шелл пригоден, полезен и незаменим:

  • интерактивная работа в терминале:
    • выполнение компиляции, запуск заданий через make;
    • сравнение текстовых файлов;
    • быстрый ad-hoc анализ данных (количество уникальных ip в логе, распределение записей по часам/минутам и т.п.);
    • разовые массовые действия (прибить много процессов; если работаете с системой контроля версий — ревертнуть или зарезолвить кучу файлов);
    • диагностика происходящего в системе (семафоры, локи, процессы, дескрипторы, место на диске и т.п.);
  • скриптование:
    • установочные скрипты, для выполнения которых нельзя рассчитывать на наличие других интерпретаторов — это не для новичков;
    • функции для кастомизации интерактивного шелла (влияющие на приглашение, меняющие каталог, устанавливающие переменные окружения) — тоже не совсем для новичков;
    • одноразовые скрипты типа массового перекодирования файлов;
    • makefile-ы.

Абсолютно первые шаги

Начинаем работу: войти и выйти

Убедитесь, что точно знаете, как запустить шелл и как из него выйти.

Если вы работаете за машиной, на которой установлена Ubuntu, вам надо запустить программу Terminal. По окончании работы можно просто закрыть окно.

На MacOS — тоже запустить Terminal.

Для доступа к удаленному серверу — воспользоваться ssh (если локально у вас MacOS, Ubuntu или другая unix-like система) или putty (если у вас Windows).

Кто я, где я?

Выполните следующие команды:

  • hostname — выводит имя машины (сервера), на которой вы сейчас находитесь;
  • whoami — выводит ваш логин (ваше имя в системе);
  • tree -d / |less — псевдографическое изображение дерева каталогов на машине; выход из пролистывания — q;
  • pwd — выводит каталог, в котором вы сейчас находитесь; в командной строке вы не можете быть «просто так», вы обязательно находитесь в каком-то каталоге (=текущий каталог, рабочий каталог). Вероятно, текущий рабочий каталог выводится у вас в приглашении (prompt).
  • ls — список файлов в текущем каталоге; ls /home — список файлов в указанном каталоге;

История команд (history)

Важное свойство полноценной командной строки — история команд.

Выполните несколько команд: hostnamelspwdwhoami. Теперь нажмите клавишу «вверх». В строке ввода появилась предыдущая команда. Клавишами «вверх» и «вниз» можно перемещаться вперед и назад по истории. Когда долистаете до hostname, нажмите Enter — команда выполнится еще раз.

Команды из истории можно не просто выполнять повторно, а еще и редактировать. Долистайте историю до команды ls, добавьте к ней ключ -l (получилось ls -l, перед минусом пробел есть, а после — нет). Нажмите Enter — выполнится модифицированная команда.

Пролистывание истории, редактирование и повторное выполнение команд — самые типичные действия при работе в командной строке, привыкайте.

Copy-paste

Командная строка очень текстоцентрична: команды — это текст, входные данные для большинства стандартных программ — текст, результат работы — чаще всего тоже текст.

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

Попробуйте выполнить команду date +"%y-%m-%d, %A"
Вводили ли вы ее целиком руками или скопировали из статьи? Убедитесь, что вы можете ее скопировать, вставить в терминал и выполнить.

После того, как научитесь пользоваться man‘ом, убедитесь, что можете скопировать и выполнить примеры команд из справки. Для проверки найдите в справке по программе date раздел EXAMPLES, скопируйте и выполните первый приведенный пример (на всякий случай: знак доллара не является частью команды, это условное изображение приглашения к вводу).

Как именно копировать текст из терминала и вставлять его в терминал — зависит от вашей системы и от ее настроек, поэтому дать универсальную инструкцию, к сожалению, не получится. На Ubuntu попробуйте так: копирование — просто выделение мышью, вставка — средняя кнопка мыши. Если не работает, или если у вас другая система — поищите в Интернете или спросите более опытных знакомых.

Ключи и опции

При исследовании истории команд вы уже столкнулись с тем, что у команды ls есть по крайней мере два варианта. Если вызвать ее просто так, она выводит простой список:

[22:26]akira@latitude-e7240:
~/shell-survival-quide> ls
Makefile shell-first-steps.md shell-first-steps.pdf
shell-survival-quide.md shell-survival-quide.pdf

Если же добавить ключ -l, к каждому файлу выводится подробная информация:

[22:28]akira@latitude-e7240:
~/shell-survival-quide> ls -l
total 332
-rw-rw-r-- 1 akira akira 198 Feb 13 11:48 Makefile
-rw-rw-r-- 1 akira akira 15107 Feb 14 22:26 shell-first-steps.md
-rw-rw-r-- 1 akira akira 146226 Feb 13 11:49 shell-first-steps.pdf
-rw-rw-r-- 1 akira akira 16626 Feb 13 11:45 shell-survival-quide.md
-rw-rw-r-- 1 akira akira 146203 Feb 13 11:35 shell-survival-quide.pdf

Это очень типичная ситуация: если к вызову команды добавлять специальные модификаторы (ключи, опции, параметры), поведение команды меняется. Сравните: tree / и tree -d /hostname и hostname -f.

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

ls -ld /home
ls -l /home
grep root /etc/passwd

man

man — справка по командам и программам, доступным на вашей машине, а также по системным вызовам и стандартной библиотеке C.

Попробуйте: man grepman atoiman chdirman man.

Пролистывание вперед и назад делается кнопками «вверх», «вниз», «PageUp», «PageDown», выход из просмотра справки — кнопкой q. Поиск определенного текста в справочной статье: нажимите / (прямой слеш), введите текст для поиска, нажимите Enter. Перемещение к следующим вхождениям — клавиша n.

Все справочные статьи делятся на категории. Самые важные:

  • 1 — исполняемые программы и шелльные команды (wclspwd и т.п.);
  • 2 — системные вызовы (forkdup2 и т.п.)
  • 3 — библиотечные функции (printfscanfcosexec).

Указывать, из какой именно категории надо показать справку, нужно в случаях совпадений имен. Например, man 3 printf описывает функцию из стандартной библиотеки C, а man 1 printf — консольную программу с таким же именем.

Посмотреть список всех доступных на машине справочных статей можно с помощью команды man -k . (точка — тоже часть комады).

less

Когда в небольшом окне терминала надо просмотреть очень длинный текст (содержимое какого-то файла, длинный man и т.п.), используют специальные программы-«пейджеры» (от слова page/страница, то есть постраничные листатели). Самый популярный листатель — less, и именно он обеспечивает вам пролистывание, когда вы читаете man-ы.

Попробуйте и сравните поведение:

cat /etc/bash.bashrc
cat /etc/bash.bashrc |less 

Можно передать файл в пролистыватель сразу в параметрах:

less /etc/bash.bashrc 

Пролистывание вверхи и вниз — кнопки «вверх», «вниз», «PageUp», «PageDown», выход — кнопка q. Поиск определенного текста: нажимите / (прямой слеш), введите текст для поиска, нажимите Enter. Перемещение к следующим вхождениям — клавиша n. (Узнаете инструкцию про man? Ничего удивительного, для вывода справки тоже используется less.)

Права

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

Посмотреть права на файл можно с помощью ls -l. Например:

> ls -l Makefile
-rw-r--r-- 1 akira students 198 Feb 13 11:48 Makefile

Этот вывод означает, что владельцу (akira) можно читать и писать файл, группе (students) — только читать, всем прочим пользователя — тоже только читать.

Если при работе вы получаете сообщение permission denied, это значит, что у вас недостаточно правна объект, с которым вы хотели работать.

Подробнее читайте в man chmod.

STDIN, STDOUT, конвейеры (пайпы)

С каждой исполняющейся программой связаны 3 стандартных потока данных: поток входных данных STDIN, поток выходных данных STDOUT, поток для вывода ошибок STDERR.

Запустите программу wc, введите текст Good day today, нажмите Enter, введтие текст good day, нажмите Enter, нажмите Ctrl+d. Программа wc покажет статистику по количеству букв, слов и строк в вашем тексте и завершится:

> wc
good day today
good day 2 5 24

В данном случае вы подали в STDIN программы двухстрочный текст, а в STDOUT получили три числа.

Теперь запустите команду head -n3 /etc/passwd, должно получиться примерно так:

> head -n3 /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin

В этом случае программа head ничего не читала из STDIN, а в STDOUT написала три строки.

Можно представить себе так: программа — это труба, в которую втекает STDIN, а вытекает STDOUT.

Важнейшее свойство юниксовой командной строки состоит в том, что программы-«трубы» можно соединять между собой: выход (STDOUT) одной программы передавать в качестве входных данных (STDIN) другой программе.

Такая конструкция из соединенных программ называется по-английски pipe (труба), по-русски — конвейер или пайп.

Объединение программ в конвейер делается символом | (вертикальная черта)

Выполните команду head -n3 /etc/passwd |wc, получится примерно следующее:

> head -n3 /etc/passwd |wc 3 3 117

Произошло вот что: программа head выдала в STDOUT три строки текста, которые сразу же попали на вход программе wc, которая в свою очередь подсчитала количество символов, слов и строк в полученном тексте.

В конвейер можно объединять сколько угодно программ. Например, можно добавить к предыдущему конвейеру еще одну программу wc, которая подсчитает, сколько слов и букв было в выводе первой wc:

> head -n3 /etc/passwd |wc |wc 1 3 24

Составление конвейеров (пайпов) — очень частое дело при работе в командной строке. Пример того, как это делается на практике, читайте в разделе «Составление конвейера-однострочника».

Перенаправление ввода-вывода

Вывод (STDOUT) програмы можно не только передать другой программе по конвейеру, но и просто записать в файл. Такое перенаправление делается с помощью > (знак «больше»):

date > /tmp/today.txt

В результате выполнения этой команды на диске появится файл /tmp/today.txt. Посмотрите его содержимое с помощью cat /tmp/today.txt

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

Если надо не перезаписать файл, а добавить вывод в его конец, используйте >>:

date >> /tmp/today.txt

Проверьте, что теперь записано в файле.

Кроме того, программе можно вместо STDIN передать любой файл. Попробуйте:

wc </etc/passwd

Что делать, когда что-то непонятно

Если вы сталкиваетесь с поведением системы, которое не понимаете, или хотите добиться определенного результата, но не знаете, как именно, советую действовать в следующем порядке (кстати, это относится не только к шеллам):

  • насколько возможно четко сформулируйте вопрос или задачу — нет ничего сложнее, чем решать «то, не знаю что»;
  • вспомните, сталкивались ли вы уже с такой же или подобной проблемой — в этом случае стоит попробовать решение, которое сработало в прошлый раз;
  • почитайте подходящие man-ы (если понимаете, какие man-ы подходят в вашем случае) — возможно, вы найдете подходящие примеры использования команд, нужные опции или ссылки на другие команды;
  • подумайте: нельзя ли немного поменять задачу? — возможно, чуть-чуть изменив условия, вы получите задачу, которую уже умеете решать;
  • задайте свой четко сформулированный вопрос в поисковой системе — возможно, ответ найдется на Stack Overflow или других сайтах;

Если ничего из перечисленного не помогло — обратитесь за советом к преподавателю, опытному коллеге или товарищу. И не бойтесь задавать «глупые» вопросы — не стыдно не знать, стыдно не спрашивать.

Если вы разобрались со сложной проблемой (самостоятельно, с помощью Интернета или других людей) — запишите свое решение на случай, если такая же проблема снова возникнет у вас или ваших товарищей. Записывать можно в простой текстовый файл, в Evernote, публиковать в соц.сетях.

Методы работы

Скопировать-и-вставить — из man-ов, из статей на StackOverflow и т.п.Командная строка состоит из текста, пользуйтесь этим: копируйте и используйте примеры команд,записывайте удачные находки на память, публикуйте их в твиттерах и блогах.

Читать man. Nuff said.

Вытащить из истории предыдущую команду, добавить в конвейер еще одну команду, запустить, повторить.См. также раздел «Составление конвейера-однострочника».

Базовые команды

  • переход в другой каталог: cd;
  • просмотр содержимого файлов: саtlessheadtail;
  • манипуляции с файлами: cpmvrm;
  • просмотр содержимого каталогов: lsls -lls -lS;
  • структура каталогов: treetree -d (можно передать в качестве параметра каталог);
  • поиск файлов: find . -name ...;

Аналитика

  • wcwc -l;
  • sort -k — сортировка по указанному полю;
  • sort -n — числовая соритровка;
  • diff — сравнение файлов;
  • grepgrep -vgrep -wgrep '\<word\>'grep -E — поиск текста;
  • uniquniq -c — уникализация строк;
  • awk — в варианте awk '{print $1}', чтобы оставить только первое поле из каждой строки, $1 можно менять на $2$3 и т.д.;

Диагностика системы

  • ps axuww — информация о процессах (запущенных программах), работающих на машине;
  • top — интерактивный просмотр самых ресурсоемких процессов;
  • df — занятое и свободное место на диске;
  • du — суммарный размер файлов в каталоге (рекурсивно с подкаталогами);
  • stracektrace — какие системные вызовы выполняет процесс;
  • lsof — какие файлы использует процесс;
  • netstat -nanetstat -nap — какие порты и сокеты открыты в системе.

Некоторых программ у вас может не быть, их надо установить дополнительно. Кроме того, некоторые опции этих программ доступны только привилегированным пользователям (root‘у).

Массовое и полуавтоматическое выполнение

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

  • test — проврека условий;
  • while read — цикл по строчкам STDIN;
  • xargs — подстановка строк из STDIN в параметры указанной программе;
  • seq — генерация последовательностей натуральных чисел;
  • () — объединить вывод нескольких команд;
  • ; — выполнить одно за другим;
  • && — выполнить при условии успешного завершения первой команды;
  • || — выполнить при условии неудачного завершения первой команды;
  • tee — продублировать вывод программы в STDOUT и в файл на диске.

Разное

  • date — текущая дата;
  • curl — скачивает документ по указаному url и пишет результат на STDOUT;
  • touch — обновить дату модификации файла;
  • kill — послать процессу сигнал;
  • true — ничего не делает, возвращает истину, полезна для организации вечных циклов;
  • sudo — выполнить команду от имени root‘а.

Составление конвейера-однострочника

Давайте рассмотрим пример реальной задачи: требуется прибить все процессы task-6-server, запущенные от имени текущего пользователя.

Шаг 1.
Понять, какая программа выдает примерно нужные данные, хотя бы и не в чистом виде. Для нашей задачи стоит получить список всех процессов в системе: ps axuww. Запустить.

Шаг 2.
Посмотреть на полученные данные глазами, придумать фильтр, который выкинет часть ненужных данных. Часто это grep или grep -v. Клавишей «Вверх» вытащить из истории предыдущую команду, приписать к ней придуманный фильтр, запустить.

ps axuww |grep `whoami`

— только процессы текущего пользователя.

Шаг 3.
Повторять пункт 2, пока не получатся чистые нужные данные.

ps axuww |grep `whoami` | grep '\<task-6-server\>'

— все процессы с нужным именем (плюс, может быть, лишние вроде vim task-6-server.c и т.п.),

ps axuww |grep `whoami` | grep '\<task-6-server\>' | grep -v vim
ps axuww |grep `whoami` | grep '\<task-6-server\>' | grep -v vim
|grep -v less

— только процессы с нужным именем

ps axuww |grep `whoami` | grep '\<task-6-server\>' | grep -v vim
|grep -v less |awk '{print $2}'

— pid-ы нужных процессов, п. 3 выполнен

Шаг 4.
Применить подходящий финальный обработчик. Клавишей «Вверх» вытаскиваем из истории предыдущую команду и добавляем обработку, которая завершит решение задачи:

  • |wc -l чтобы посчитать количество процессов;
  • >pids чтобы записать pid-ы в файл;
  • |xargs kill -9 убить процессы.

Задания для тренировки

Хотите попрактиковаться в новых умениях? Попробуйте выполнить следующие задания:

  • получите список всех файлов и каталогов в вашем домашнем каталоге;
  • получите список всех man-статей из категории 2 (системные вызовы);
  • посчитайте, сколько раз в man-е по программе grep встречается слово grep;
  • посчитайте, сколько процессов запущено в данный момент от имени пользователя root;
  • найдите, какая команда встречается в максимальном количестве категорий справки (man);
  • подсчитайте, сколько раз встречается слово var на странице ya.ru.

Подсказка: вам понадобится findgrep -oawk '{print $1}', регулярные выражения в grepcurl -s.

Что изучать дальше?

Если командная строка начинает вам нравиться, не останавливайтесь, продолжайте совершенствовать свои навыки.

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

  • awk
  • sed
  • find со сложными опциями
  • apropos
  • locate
  • telnet
  • netcat
  • tcpdump
  • rsync
  • screen
  • ssh
  • tar
  • zgrepzless
  • visudo
  • crontab -e
  • sendmail

Кроме того, со временем стоит освоить какой-нибудь скриптовый язык,например, perl или python, или даже их оба.

 

Командный язык shell

Командный язык shell (в переводе — раковина, скорлупа) фактически есть язык программирования очень высокого уровня. На этом языке пользователь осуществляет управление компьютером. Обычно, после входа в систему вы начинаете взаимодействовать с командной оболочкой. Признаком того, что оболочка (shell) готова к приему команд служит выдаваемый ею на экран промптер. В простейшем случае это один доллар («$»). Shell не является необходимым и единственным командным языком (хотя именно он стандартизован в рамках POSIX [POSIX 1003.2] — стандарта мобильных систем). Например, немалой популярностью пользуется язык cshell, есть также kshell, bashell и другие. Более того, каждый пользователь может создать свой командный язык. Может одновременно на одном экземпляре операционной системы работать с разными командными языками. shell — это одна из многих команд UNIX. То есть в набор команд оболочки «shell» входит команда «sh» — вызов интерпретатора «shell». Первый «shell» вызывается автоматически при вашем входе в систему и выдает на экран промтер. После этого вы можете вызывать на выполнение любые команды, в том числе и снова сам «shell», который вам создаст новую оболочку внутри прежней. Так например, если вы подготовите в редакторе файл «file_1»:

 echo Hello!

то это будет обычный текстовый файл, содержащий команду «echo», которая при выполнении выдает все написанное правее ее на экран. Можно сделать файл «file_1» выполняемым с помощью команды «chmod 755 file_1». Но его можно выполнить, вызвав явно команду «sh» («shell»):

 sh file_1

или

 sh < file1 

Файл можно выполнить и в текущем экземпляре «shell». Для этого существует специфическая команда «.» (точка), т.е.

 . file_1

Поскольку UNIX — система многопользовательская, вы можете даже на персональном компьютере работать параллельно, скажем, на 12-ти экранах (переход с экрана на экран ALT/функциональная клавиша), имея на каждом экране нового (или одного и того же) пользователя со своей командной оболочкой. Можете и в графическом режиме X-Window также открыть большое число окон, а в каждом окне может быть свой пользователь со своей командной оболочкой… Стержневым элементом языка shell является команда.

Структуры команд:

Команды в shell обычно имеют следующий формат:

 <имя команды> <флаги> <аргумент(ы)>

Например:

 ls -ls /usr/bin

Где ls — имя команды выдачи содержимого директория, -ls — флаги ( «-» — признак флагов, l — длинный формат, s — об’ем файлов в блоках), /usr/bin — директорий, для которого выполняется команда. Эта команда выдаст на экран в длинном формате содержимое директория /usr/bin, при этом добавит информацию о размере каждого файла в блоках. К сожалению, такая структура команды выдерживается далеко не всегда. Не всегда перед флагами ставится минус, не всегда флаги идут одним словом. Есть разнообразие и в представлении аргументов. К числу команд, имеющих экзотические форматы, относятся и такие «ходовые» команды, как сс — вызов компилятора языка С, tar — работа с архивами, dd — копирование файла с преобразованием, find — поиск файлов и ряд других. Как правило, первое слово shell воспринимает, как команду. Поэтому в командной строке

 cat cat

первое слово будет расшифровано shell, как команда (конкатенации), которая выдаст на экран файл с именем «cat» (второе слово), находящийся в текущем директории. Перенаправление команд Стандартный ввод (вход) — «stdin» в ОС UNIX осуществляется с клавиатуры терминала, а стандартный вывод (выход) — «stdout» направлен на экран терминала. Существует еще и стандартный файл диагностических сообщений — «stderr», о котором речь будет чуть позже. Команда, которая может работать со стандартным входом и выходом, называется ФИЛЬТРОМ. Пользователь имеет удобные средства перенаправления ввода и вывода на другие файлы (устройства). Символы «>» и «>>» обозначают перенаправление вывода. ls >file_1 команда «ls» сформирует список файлов текущего каталога и поместит его в файл «file_1» (вместо выдачи на экран). Если файл «file_1» до этого существовал, то он будет затерт новым.

 pwd >>file_1

команда pwd сформирует полное имя текущего каталога и поместит его в конец файла «file_1», т.е. «>>» добавляет в файл, если он непустой. Символы «<» и «<<» обозначают перенаправление ввода.

 wc -l <file_1

подсчитает и выдаст на экран число строк в файле file_1.

 ed file_2 <<!

создаст с использованием редактора файл «file_2», непосредственно с терминала. Окончание ввода определяется по символу, стоящему правее «<<» (т. е. «!»). То есть ввод будет закончен, когда первым в очередной строке будет «!». Можно сочетать перенаправления. Так

 wc -l <file_3 >file_4 

и

 wc -l >file_4 <file_3

выполняются одинаково: подсчитывается число строк файла «file_3» и результат помещается в файл «file_4». Средство, объединяющее стандартный выход одной команды со стандартным входом другой, называется КОНВЕЙЕРОМ и обозначается вертикальной чертой «|».

 ls | wc -l

список файлов текущего каталога будет направлен на вход команды «wc», которая на экран выведет число строк каталога. Конвейером можно объединять и более двух команд, когда все они, возможно кроме первой и последней — фильтры:

 cat file_1 | grep -h result | sort | cat -b > file_2

Данный конвейер из файла «file_1» («cat») выберет все строки, содержащие слово «result» («grep»), отсортирует («sort») полученные строки, а затем пронумерует («cat -b») и выведет результат в файл «file_2». Поскольку устройства в ОС UNIX представлены специальными файлами, их можно использовать при перенаправлениях. Специальные файлы находятся в каталоге «/dev». Например, «lp» — печать; «console» — консоль; «ttyi» — i-ый терминал; «null» — фиктивный (пустой) файл (устройство). Тогда, например,

 ls > /dev/lp

выведет содержимое текущего каталога на печать, а file_1 < /dev/null обнулит файл «file_1».

 sort file_1 | tee /dev/lp | tail -20

В этом случае будет отсортирован файл «file_1» и передан на печать, а 20 последних строк также будут выданы на экран. Вернемся к перенаправлению выхода. Стандартные файлы имеют номера:

0 — stdin, 1 — stdout 2 — stderr. Если вам не желательно иметь на экране сообщение об ошибке, вы можете перенаправить его с экрана в указанный вами файл (или вообще «выбросить», перенаправив в файл «пустого устройства» — /dev/null). Например при выполнении команды

 cat file_1 file_2

которая должна выдать на экран последовательно содержимое файлов «file_1» и «file_2», выдаст вам, например, следующее

 111111 222222 cat: f2: No such file or directory

где 111111 222222 — содержимое файла «file_1», а файл «file_2» отсутствует, о чем команда «cat» выдала сообщение в стандартный файл диагностики, по умолчанию, как и стандартный выход, представленный экраном. Если вам не желательно такое сообщение на экране, его можно перенаправить в указанный вами файл:

 cat file_1 file_2 2>f-err

сообщения об ошибках будут направляться (об этом говорит перенаправление «2>») в файл «f-err». Кстати, вы можете всю информацию направлять в один файл «ff», использовав в данном случае конструкцию

 cat file_1 file_2 >>ff 2>ff

Можно указать не только какой из стандартных файлов перенаправлять, но и в какой стандартный файл осуществить перенаправление.

 cat file_1 file_2 2>>ff 1>&2

Здесь сначала «stderr» перенаправляется (в режиме добавления) в файл «ff», а затем стандартный выход перенаправляется на «stderr», которым к этому моменту является файл «ff». То есть результат будет аналогичен предыдущему. Конструкция «1>&2» — означает, что кроме номера стандартного файла, в который перенаправить, необходимо впереди ставить «&»; вся конструкция пишется без пробелов. <- закрывает стандартный ввод. >- закрывает стандартный вывод. Командные файлы. Для того, чтобы текстовый файл можно было использовать как команду, существует несколько возможностей. Пусть с помощью редактора создан файл с именем «cmd», содержащий одну строку следующего вида:

 date; pwd; ls

Можно вызвать shell как команду, обозначаемую «sh», и передать ей файл «cmd», как аргумент или как перенаправленный вход, т.е.

 $ sh cmd 

или

 $ sh <cmd

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

 chmod 711 cmd

сделает код защиты «rwx__x__x». Тогда простой вызов

 cmd

приведет к выполнению тех же трех команд. Результат будет тот же, если файл с содержимым

 date; pwd; ls

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

Отладка командных файлов 

В SHELL используются два механизма отладки командных файлов. Первый из них: set -v выводит строки командного файла по мере их чтения. Этот режим применяется при поиске синтаксических ошибок. Для его использования не требуется производить модификацию командного файла, например: sh -v proc… здесь proc — имя командного файла. Ключ -v может использоваться вместе с ключом -n, предотвращающим выполнение следующих за ним команд (команда set -n блокирует терминал до тех пор, пока не вводится признак конца файла EOF). Команда set -х выводит команды по мере их выполнения, причём на терминал выводятся строки программы и на место переменных подставляются их значения. Для отмены ключей -x и -v можно воспользоваться командой set — а для установки — присвоить соответствующее значение макропеременной. СРЕДА SHELL (ПЕРЕМЕННЫЕ И ПАРАМЕТРЫ) На языке shell можно писать командные файлы и с помощью команды «chmod» делать их выполняемыми. После этого они ни чем не отличаются от прочих команд ОС UNIX.

shell-переменные 

Имя shell-переменной — это начинающаяся с буквы последовательность букв, цифр и подчеркиваний. Значение shell-переменной — строка символов. То, что в shell всего два типа данных: строка символов и текстовый файл, с одной стороны, позволяет легко вовлекать в программирование конечных пользователей, никогда ранее программированием не занимавшихся, а с другой стороны, вызывает некий внутренний протест у многих программистов, привыкших к существенно большему разнообразию и большей гибкости языковых средств. Однако интересно наблюдать то, как высококлассные программисты, освоившись с «правилами игры» shell, пишут на нем программы во много раз быстрее, чем на Си, но, что особенно интересно, в ряде случаев эти программы работают даже быстрее, чем реализованные на Си. Имя переменной аналогично традиционному представлению об идентификаторе, т.е. именем может быть последовательность букв, цифр и подчеркиваний, начинающаяся с буквы или подчеркивания. Для присваивания значений переменным может использоваться оператор присваивания «=».

 var_1=13	- "13" - это не число, а строка из двух цифр. var_2="ОС UNIX"	- здесь двойные кавычки (" ") необходимы, так как в строке есть пробел.

Возможны и иные способы присваивания значений shell-переменным. Так например запись,

 DAT=`date`

приводит к тому, что сначала выполняется команда «date» (обратные кавычки говорят о том, что сначала должна быть выполнена заключенная в них команда), а результат ее выполнения, вместо выдачи на стандартный выход, приписывается в качестве значения переменной, в данном случае «DAT». Можно присвоить значение переменной и с помощью команды «read», которая обеспечивает прием значения переменной с (клавиатуры) дисплея в диалоговом режиме. Обычно команде «read» в командном файле предшествует команда «echo», которая позволяет предварительно выдать какое-то сообщение на экран. Например:

 echo -n "Введите трехзначное число:" read x

При выполнении этого фрагмента командного файла, после вывода на экран сообщения

 Введите трехзначное число:

интерпретатор остановится и будет ждать ввода значения с клавиатуры. Если вы ввели, скажем, «753» то это и станет значением переменной «x». Одна команда «read» может прочитать (присвоить) значения сразу для нескольких переменных. Если переменных в «read» больше, чем их введено (через пробелы), оставшимся присваивается пустая строка. Если передаваемых значений больше, чем переменных в команде «read», то лишние игнорируются. При обращении к shell-переменной необходимо перед именем ставить символ «$». Так команды echo $var_2 echo var_2 выдадут на экран

 ОС UNIX var_2 Экранирование 

Рассмотрим более подробно приемы экранирования, используемые в shell. В качестве средств экранирования используются двойные кавычки (» «), одинарные кавычки (‘ ‘) и бэк-слэш (\). Из примеров очевидно их действие: Можно в одной строке записывать несколько приcваиваний.

 x=22 y=33 z=$x A="$x" B='$x' C=\$x D="$x + $y + $z" E='$x + $y + $z' F=$x\ +\ $y\ +\ $z

(присваивание G=$x+$y не было бы выполнено из-за пробелов) Тогда

 echo A = $A B = $B C = $C echo D = $D E = $E F = $F eval echo evaluated A = $A eval echo evaluated B = $B eval echo evaluated C = $C

Выдадут на экран

 A = 22 B = $x C = $x D = 22 + 33 + 22 E = $x + $y + $z F = 22 + 33 + 22 evaluated A = 22 evaluated B = 22 evaluated C = 22

Приведем еще примеры, связанные с экранированием перевода строки. Пусть переменной «string» присвоено значение «массива» 2×3: abc def Обратим внимание, что для избежания присваивания лишних пробелов вторая строка массива начата с первой позиции следующей строки: string=»abc def» Тогда три варианта записи переменной в команде «echo» echo $string echo ‘$string’ echo «$string» дадут соответственно три различных результата: abc def $string abc def а последовательность команд echo «str_1 str_2» > file_1 echo ‘str_1 str_2’ > file_2 cat file_1 file_2 даст выдаст последовательно одинаковые файлы file_1 и file_2: str_1 str_2 str_1 str_2 Заметим также, что бэк-слэш (\) не только экранирует следующий за ним символ, что позволяет использовать специальные символы просто как символы, представляющие сами себя (он может экранировать и сам себя — \\), но в командном файле бэк-слэш позволяет об’единять строки в одну (экранировать конец строки). Например, приводившийся ранее пример командной строки:

 cat file_1 | grep -h result | sort | cat -b > file_2

может быть записан в командном файле, скажем, как

 cat file_1 | grep -h \ result | sort | cat -b > file_2

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

 cat file_1	| grep -h result	| sort	| cat -b > file_2

. Манипуляции с shell-переменными Несмотря на то, что shell-переменные в общем случае воспринимаются как строки, т. е. «35» — это не число, а строка из двух символов «3» и «5», в раде случаев они могут интерпретироваться иначе, например, как целые числа. Разнообразные возможности имеет команда «expr». Проиллюстрируем некоторые на примерах: Выполнение командного файла:

 x=7 y=2 a=`expr $x + $y`  ; echo a=$a a=`expr $a + 1`  ; echo a=$a b=`expr $y - $x`  ; echo b=$b c=`expr $x '*' $y` ; echo c=$c d=`expr $x / $y`  ; echo d=$d e=`expr $x % $y`  ; echo e=$e

выдаст на экран

 a=9 a=10 b=-5 c=14 d=3 e=1

Операция умножения («*») обязательно должна быть заэкранирована, поскольку в shell этот значок воспринимается, как спецсимвол, означающий, что на это место может быть подставлена любая последовательность символов. С командой «expr» возможны не только (целочисленные) арифметические операции, но и строковые:

 A=`expr 'cocktail' : 'cock'` ; echo $A B=`expr 'cocktail' : 'tail'`  ; echo $B C=`expr 'cocktail' : 'cook'` ; echo $C D=`expr 'cock' : 'cocktail'` ; echo $D

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

 4 0 0 0

. Экспорт переменных В ОС UNIX существует понятие процесса. Процесс возникает тогда, когда запускается на выполнение какая-либо команда. Например, при наборе на клавиатуре «р <Enter>» порождается процесс «р». В свою очередь «р» может породить другие процессы. Допустим, что «р» вызывает «р1» и «р2», которые последовательно порождают соответствующие процессы. У каждого процесса есть своя среда — множество доступных ему переменных. Например, до запуска «р» уже существовала среда, в которой уже были определены некоторые переменные. Запуск «р» порождает новую среду; уже в ней будут порождены «р1» и «р2». Переменные локальны в рамках процесса, в котором они объявлены, т.е. где им присвоены значения. Для того, чтобы они были доступны и другим порождаемым процессам, надо передать их явным образом. Для этого используется встроенная команда «export».

Параметры 

В командный файл могут быть переданы параметры. В shell используются позиционные параметры (т.е. существенна очередность их следования). В командном файле соответствующие параметрам переменные (аналогично shell-переменным) начинаются с символа «$», а далее следует одна из цифр от 0 до 9: Пусть «examp-1» вызывается с параметрами «cock» и «tail». Эти параметры попадают в новую среду под стандартными именами «1» и «2». В (стандартной) переменной с именем «0» будет храниться имя вызванного расчета. При обращении к параметрам перед цифрой ставится символ доллара «$» (как и при обращении к переменным): $0 соответствует имени данного командного файла; $1 первый по порядку параметр; $2 второй параметр и т.д. Поскольку число переменных, в которые могут передаваться параметры, ограничено одной цифрой, т.е. 9-ю («0», как уже отмечалось имеет особый смысл), то для передачи большего числа параметров используется специальная команда «shift». Своеобразный подход к параметрам дает команда «set». Например, фрагмент

 set a b с echo первый=$1 второй=$2 третий=$3

выдаст на экран

 первый=a второй=b третий=c

т.е. команда «set» устанавливает значения параметров. Это бывает очень удобно. Например, команда «date» выдает на экран текущую дату, скажем, «Mon May 01 12:15:10 2000», состоящую из пяти слов, тогда

 set `date` echo $1 $3 $5

выдаст на экран

 Mon 01 2000

Команда «set» позволяет также осуществлять контроль выполнения программы, например: set -v на терминал выводятся строки, читаемые shell. set +v отменяет предыдущий режим. set -x на терминал выводятся команды перед выполнением. set +x отменяет предыдущий режим. Команда «set» без параметров выводит на терминал состояние программной среды.

Подстановки shell-интерпретатора 

Перед началом непосредственной интерпретации и выполнением команд, содержащихся в командных файлах, shell выполняет различные виды подстановок: 1. ПОДСТАНОВКА РЕЗУЛЬТАТОВ. Выполняются все команды, заключенные в обратные кавычки, и на их место подставляется результат. 2. ПОДСТАНОВКА ЗНАЧЕНИЙ ПАРАМЕТРОВ И ПЕРЕМЕННЫХ. То есть слова, начинающиеся на «$», заменяются соответствующими значениями переменных и параметров. 3. ИНТЕРПРЕТАЦИЯ ПРОБЕЛОВ. Заэкранированные пробелы игнорируются. 4. ГЕНЕРАЦИЯ ИМЕН ФАЙЛОВ. Проверяются слова на наличие в них спецсимволов («*», «?»,»[]») и выполняются соответствующие генерации. Программная среда Каждый процесс имеет среду, в которой он выполняется. Shell использует ряд переменных этой среды. Если вы наберете команду «set» без параметров, то на экран будет выдана информация о ряде стандартных переменных, созданных при входе в систему (и передаваемых далее всем вашим новым процессам «по наследству»), а также переменных, созданных и экспортируемых вашими процессами. Конкретный вид и содержание выдаваемой информации в немалой степени зависит от того, какая версия UNIX используется и как инсталлирована система.

Результат выполнения команды set без параметров (не полный):

 HOME=/root PATH=/usr/local/bin:/usr/bin:/bin:.:/usr/bin/X11: IFS= LOGNAME=sae MAIL=/var/spool/mail/sae PWD=/home/sae/STUDY/SHELL PS1=${PWD}:" " PS2=> SHELL=/bin/bash

Прокомментируем значения переменных. HOME=/root — это имя домашнего директория, в котором пользователь оказывается после входа в систему. То есть, правильно набрав имя и пароль, я окажусь в директории «/root». PATH=/bin:/usr/bin:.:/usr/local/bin:/usr/bin/X11 — эта переменная задает последовательность файлов, которые просматривает «shell» в поисках команды. Имена файлов разделяются здесь двоеточиями. Последовательность просмотра соответствует очередности следования имен в тропе. Но первоначально поиск происходит среди так называемых встроенных команд. В число встроенных команд входят наиболее часто используемые команды, например «echo», «cd», «pwd», «date». После этого система просматривает директорий «/bin», в котором могут находиться команды «sh», «cp», «mv», «ls» и т.п. Затем директорий «/usr/bin» с командами «cat», «сс», «expr», «nroff», «man» и многими другими. Далее поиск происходит в текущем директории («.», или другое обозначение «пусто», т.е.»»), где скорее всего находятся написанные вами команды. После набора командной строки и нажатия <Enter> «shell» (после выполнения необходимых подстановок) распознает имя, соответствующее команде и осуществляет ее поиск в директориях, перечисленных в PATH. Если команда размещена вне этих директориев, она не будет найдена. Если присутствует несколько команд с одинаковым именем, то вызвана будет та, которая расположена в директории, просматриваемом первым. PATH, как и прочие переменные, можно легко менять, добавляя, переставляя или исключая директории. IFS= (Внутренний Разделитель Полей) перечисляет символы, которые служат для разделения слов (полей). Таковыми являются «пробел», «табуляция» и «перевод строки», поэтому здесь слева от присваивания ничего не видно и занято две строки. LOGNAME=root — имя входа («имя» пользователя). MAIL=/var/spool/mail/root — имя файла, в который поступает (электронная) почта. PWD=/root — имя текущего директория PS1=${PWD}:» » — вид промтера. В данном случае в промптере будет выдаваться имя текущего директория двоеточие и пробел. То есть здесь будет «/root: «. PS2=> — этот промтер (здесь «>») используется как приглашение к продолжению ввода (в очередной строке) незаконченной команды. Например, наберите открывающую скобку «(» и после нажатия <Enter> в следующей строке вы увидите этот промптер. Если пока не знаете, что дальше делать, наберите закрывающую скобку «)» и он исчезнет. SHELL=/bin/sh — эта переменная указывает оболочку, которую использует пользователь. В данном случае используется стандартный shell («sh»). Исходная среда устанавливается автоматически при входе в систему с использованием файлов типа «/etc/rc» и «/etc/.profile». Один из способов просто изменит среду (например, тропу поиска команд, вид промтера, вид оболочки, цвет экрана и т.п.) можно, разместив эту информацию в своем домашнем директории в специализированном файле «.profile» (${HOME}/.profile), присвоив нужные значения переменным среды. То есть вызвать это файл в редактор и написать, что пожелаете). Тогда при каждом вашем входе в систему этот файл будет автоматически выполняться и устанавливать новую среду. Этот файл должен ОБЯЗАТЕЛЬНО размещаться в вашем ДОМАШНЕМ директории (директории входа). Следует иметь в виду, что имена файлов, начинающиеся с точки, вообще имеют особый статус. Так, они не выдаются на экран простой командой «ls» — необходимо вызывать эту команду с флагом «-a». Кстати, и не уничтожаются огульно командой «rm *». Сам интерпретатор shell автоматически присваивает значения следующим переменным (параметрам): ? значение, возвращенное последней командой; $ номер процесса; ! номер фонового процесса;

  1. число позиционных параметров, передаваемых в shell;
  • перечень параметров, как одна строка;

@ перечень параметров, как совокупность слов; — флаги, передаваемые в shell. При обращении к этим переменным (т.е при использовании их в командном файле — shell-программе) следует впереди ставить «$». Важную роль при создании уникальных файлов играет специальная переменная «$$», значение которой соответствует номеру процесса, выполняющего данный расчет. Каждый новый расчет, выполняемый компьютером, инициирует один или несколько процессов, автоматически получающих номера по порядку. Поэтому, используя номер процесса в качестве имени файла, можно быть уверенным, что каждый новый файл будет иметь новое имя (не запишется на место уже существующего). Достоинство является и главным недостатком такого способа именования файлов. Неизвестно, какие имена будут присвоены файлам. И, если в рамках данного процесса можно найти файл «не глядя», т.е., обратившись к нему, используя $$, то потом такие файлы можно легко потерять. Это создает дополнительные проблемы при отладке программ. Вызов интерпритатора Вслед за регистрацией пользователя в системе (с помощью команды login) вызывается интерпретатор языка SHELL. Если регистрационный справочник пользователя содержит файл .profile, то прежде чем с терминала будет принята хотя бы одна команда, интерпретатор выполняет этот файл (подразумевается, что файл .profile содержит команды). При вызове могут указываться следующие ключи: -c строка Команды считываются из заданной строки. -s Команды читаются из стандартного файла ввода. Сообщения интерпретатора записываются в стандартный файл диагностик. -i Интерактивный режим работы. Если первым символом параметра «0» является знак -, то команды считываются из файла .profile.

===ПРОГРАММНЫЕ СТРУКТУРЫ=== 

Как во всяком языке программирования в тексте на языке shell могут быть комментарии. Для этого используется символ «#». Все, что находится в строке (в командном файле) левее этого символа, воспринимается интерпретатором как комментарий. Например,

 # Это комментарий.

Как во всяком процедурном языке программирования в языке shell есть операторы. Ряд операторов позволяет управлять последовательностью выполнения команд. В таких операторах часто необходима проверка условия, которая и определяет направление продолжения вычислений.

Команда test ("[ ]") 

Команда test проверяет выполнение некоторого условия. С использованием этой (встроенной) команды формируются операторы выбора и цикла языка shell. Два возможных формата команды:

 test условие

или

 [ условие ]

мы будем пользоваться вторым вариантом, т.е. вместо того, чтобы писать перед условием слово «test», будем заключать условие в скобки, что более привычно для программистов. На самом деле shell будет распознавать эту команду по открывающей скобке «[«, как слову, соответствующему команде «test». Между скобками и содержащимся в них условием обязательно должны быть пробелы. Пробелы должны быть и между значениями и символом сравнения или операции В shell используются условия различных «типов». УСЛОВИЯ ПРОВЕРКИ ФАЙЛОВ: -f file файл «file» является обычным файлом; -d file файл «file» — каталог; -с file файл «file» — специальный файл; -r file имеется разрешение на чтение файла «file»; -w file имеется разрешение на запись в файл «file»; -s file файл «file» не пустой.

УСЛОВИЯ ПРОВЕРКИ СТРОК: str1 = str2 строки «str1» и «str2» совпадают; str1 != str2 строки «str1» и «str2» не совпадают; -n str1 строка «str1» существует (непустая); -z str1 строка «str1» не существует (пустая). Примеры.

 x="who is who"; export x; [ "who is who" = "$x" ]; echo $? 0 x=abc ; export x ; [ abc = "$x" ] ; echo $? 0 x=abc ; export x ; [ -n "$x" ] ; echo $? 0 x="" ; export x ; [ -n "$x" ] ; echo $? 1

Кроме того, существуют два стандартных значения условия, которые могут использоваться вместо условия (для этого не нужны скобки). УСЛОВИЯ СРАВНЕНИЯ ЦЕЛЫХ ЧИСЕЛ: x -eq y «x» равно «y», x -ne y «x» неравно «y», x -gt y «x» больше «y», x -ge y «x» больше или равно «y», x -lt y «x» меньше «y», x -le y «x» меньше или равно «y». СЛОЖНЫЕ УСЛОВИЯ: Реализуются с помощью типовых логических операций: ! (not) инвертирует значение кода завершения. -o (or) соответствует логическому «ИЛИ». -a (and) соответствует логическому «И».

Условный оператор "if" 

В общем случае оператор «if» имеет структуру

 if условие then список

[elif условие then список]

 [else список] fi

Здесь «elif» сокращенный вариант от «else if» может быть использован наряду с полным, т.е. допускается вложение произвольного числа операторов «if» (как и других операторов). Разумеется «список» в каждом случае должен быть осмысленный и допустимый в данном контексте. Самая усеченная структура этого оператора

 if условие then список fi

если выполнено условие (как правило это ком получен код завершения «0», то выполняется «список», иначе он пропускается. Примеры. Пусть написан «if-1»

 if [ $1 -gt $2 ]

then pwd else echo $0 : Hello!

 fi

Тогда вызов if-1 12 11 даст /home/sae/STUDY/SHELL а if-1 12 13 даст if-1 : Hello!

Оператор вызова ("case") 

Оператор выбора «case» имеет структуру:

 case строка in

шаблон) список команд;; шаблон) список команд;; … шаблон) список команд;;

 esac

Здесь «case» «in» и «esac» — служебные слова. «Строка» (это может быть и один символ) сравнивается с «шаблоном». Затем выполняется «список команд» выбранной строки. Непривычно выглядят в конце строк выбора «;;», но написать здесь «;» было бы ошибкой. Для каждой альтернативы может быть выполнено несколько команд. Если эти команды будут записаны в одну строку, то символ «;» будет использоваться как разделитель команд. Обычно последняя строка выбора имеет шаблон «*», что в структуре «case» означает «любое значение». Эта строка выбирается, если не произошло совпадение значения переменной (здесь $z) ни с одним из ранее записанных шаблонов, ограниченных скобкой «)». Значения просматриваются в порядке записи.

Оператор цикла с перечислением ("for") 

Оператор цикла «for» имеет структуру:

 for имя [in список значений]

do список команд done где «for» — служебное слово определяющее тип цикла, «do» и «done» — служебные слова, выделяющие тело цикла. Пусть команда «lsort» представлена командным файлом

 for i in file_1 file_2 file_3 do proc_sort $i done

В этом примере имя «i» играет роль параметра цикла. Это имя можно рассматривать как shell-переменную, которой последовательно присваиваются перечисленные значения (i=file_1, i=file_2, i=file_3), и выполняется в цикле команда «proc_sort». Часто используется форма «for i in *», означающая «для всех файлов текущего каталога». Пусть «proc_sort» в свою очередь представляется командным файлом

 cat $1 | sort | tee /dev/lp > ${1}_sorted

т.е. последовательно сортируются указанные файлы, результаты сортировки выводятся на печать («/dev/lp») и направляются в файлы file_1_sorted file_2_sorted и file_3_sorted

Оператор цикла с истинным условием ("while") 

Структура «while», также обеспечивающая выполнение расчетов, предпочтительнее тогда, когда неизвестен заранее точный список значений параметров или этот список должен быть получен в результате вычислений в цикле. Оператор цикла «while» имеет структуру:

 while условие

do список команд done где «while» — служебное слово определяющее тип цикла с истинным условием. Список команд в теле цикла (между «do» и «done») повторяется до тех пор, пока сохраняется истинность условия (т.е. код завершения последней команды в теле цикла равен «0») или цикл не будет прерван изнутри специальными командами («break», «continue» или «exit»). При первом входе в цикл условие должно выполняться. Команда «break [n]» позволяет выходить из цикла. Если «n» отсутствует, то это эквивалентно «break 1». «n» указывает число вложенных циклов, из которых надо выйти, например, «break 3» — выход из трех вложенных циклов. В отличие от команды «break» команда «continue [n]» лишь прекращает выполнение текущего цикла и возвращает на НАЧАЛО цикла. Она также может быть с параметром. Например, «continue 2» означает выход на начало второго (если считать из глубины) вложенного цикла. Команда «exit [n]» позволяет выйти вообще из процедуры с кодом возврата «0» или «n» (если параметр «n» указан). Эта команда может использоваться не только в циклах. Даже в линейной последовательности команд она может быть полезна при отладке, чтобы прекратит выполнение (текущего) расчета в заданной точке.

Оператор цикла с ложным условием ("until") 

Оператор цикла «until» имеет структуру:

 until условие

do список команд done где «until» — служебное слово определяющее тип цикла с ложным условием. Список команд в теле цикла (между «do» и «done») повторяется до тех пор, пока сохраняется ложность условия или цикл не будет прерван изнутри специальными командами («break», «continue» или «exit»). При первом входе в цикл условие не должно выполняться. Отличие от оператора «while» состоит в том, что условие цикла проверяется на ложность (на ненулевой код завершения последней команды тела цикла) проверяется ПОСЛЕ каждого (в том числе и первого!) выполнения команд тела цикла. Пример.

 until false do

read x if [ $x = 5 ] then echo enough ; break else echo some more fi

 done

Здесь программа с бесконечным циклом ждет ввода слов (повторяя на экране фразу «some more»), пока не будет введено «5». После этого выдается «enough» и команда «break» прекращает выполнение цикла.

Пустой оператор 

Пустой оператор имеет формат

  :

Ничего не делает. Возвращает значение «0».».

Функции в shell 

Функция позволяет подготовить список команд shell для последующего выполнения. Описание функции имеет вид:

 имя() { список команд }

после чего обращение к функции происходит по имени. При выполнении функции не создается нового процесса. Она выполняется в среде соответствующего процесса. Аргументы функции становятся ее позиционными параметрами; имя функции — ее нулевой параметр. Прервать выполнение функции можно оператором «return [n]», где (необязательное) «n» — код возврата.

Обработка прерываний ("trap") 

Бывает необходимо защитить выполнение программы от прерывания. Наиболее часто приходится встречаться со следующими прерываниями, соответствующими сигналам: 0 выход из интерпретатора, 1 отбой (отключение удаленного абонента), 2 прерывание от <Del>, 9 уничтожение (не перехватывается), 15 окончание выполнения. Для защиты от прерываний существует команда «trap», имеющая формат:

 trap 'список команд' сигналы

Если в системе возникнут прерывания, чьи сигналы перечислены через пробел в «сигналы», то будет выполнен «список команд», после чего (если в списке команд не была выполнена команда «exit») управление вернется в точку прерывания и продолжится выполнение командного файла. Например, если перед прекращением по прерываниям выполнения какого то командного файла необходимо удалить файлы в «/tmp», то это может быть выполнено командой «trap»:

 trap 'rm /tmp/* ; exit 1' 1 2 15

которая предшествует прочим командам файла. Здесь, после удаления файлов будет осуществлен выход «exit» из командного файла.

Кому это надо?

А стоит ли вообще изучать сегодня командную строку и шелльный скриптинг? Определенно стоит. Приведу только несколько примеров из требований Facebook к кандидатам, которые хотят поступить на работу в FB.

Data Scientist, Economic Research: Comfort with the command line and with Unix core tools; preferred: adeptness with a scripting language such as Python, or previous software engineering experience.

MySQL Database Engineer: High degree of proficiency in Shell scripting (Bash, Awk, etc); high degree of proficiency in Linux administration.

Manufacturing Quality Engineer, Server: Scripting skills in Bash, Perl, or Python is desirable.

Data Platform Engineer: 2 years experience with Unix/Linux systems.

DevOps Engineer, Data: 2 years experience with Unix/Linux system administration and programming.

ПРОСТЕЙШИЕ СРЕДСТВА SHELL

Командный язык shell (в переводе — раковина, скорлупа) фактически есть язык программирования очень высокого уровня. На этом языке пользователь осуществляет управление компьютером. Обычно, после входа в систему вы начинаете взаимодействовать с командной оболочкой (если угодно — она начинает взаимодействовать с вами). Признаком того, что оболочка (shell) готова к приему команд служит выдаваемый ею на экран промптер. В простейшем случае это один доллар («$»).

Shell не является необходимым и единственным командным языком (хотя именно он стандартизован в рамках POSIX [POSIX 1003.2] — стандарта мобильных систем). Например, немалой популярностью пользуется язык cshell, есть также kshell, bashell (из наиболее популярных в последнее время) и другие. Более того, каждый пользователь может создать свой командный язык. Может одновременно на одном экземпляре операционной системы работать с разными командными языками.

ОБРАТИТЕ ВНИМАНИЕ. shell — это одна из многих команд UNIX. То есть в набор команд оболочки (интерпретатора) «shell» входит команда «sh» — вызов интерпретатора «shell». Первый «shell» вызывается автоматически при вашем входе в систему и выдает на экран промтер. После этого вы можете вызывать на выполнение любые команды, в том числе и снова сам «shell», который вам создаст новую оболочку внутри прежней.

Так например, если вы подготовите в редакторе файл «f1»:

 echo Hello!

то это будет обычный текстовый файл, содержащий команду «echo», которая при выполнении выдает все написанное правее ее на экран. Можно сделать файл «f1» выполняемым с помощью команды «chmod 755 f1». Но его можно ВЫПОЛНИТЬ, вызвав явно команду (!) «sh» («shell»):

 sh f1

или

 sh < f1

Файл можно выполнить и в текущем экземпляре «shell». Для этого существует специфическая команда «.» (точка), т.е.

 . f1

ВАЖНОЕ ПРЕДУПРЕЖДЕНИЕ. Не начинайте командные файлы с символа «#», хотя естественно начинать его с комментария. Дело в том, что такой командный файл в оболочке C-Shell («csh») будет интерпретирован как выполняемый в «csh», в результате будет активизирован. интерпретатор «csh».

СОВЕТ. Начинайте командный sh-файл с пустой строки или пустого оператора «:».

Поскольку UNIX — система многопользовательская, вы можете даже на персональном компьютере работать параллельно, скажем, на 12-ти экранах (переход с экрана на экран ALT/функциональная клавиша), имея на каждом экране нового (или одного и того же) пользователя со своей командной оболочкой. Можете и в графическом режиме X-Window также открыть большое число окон, а в каждом окне может быть свой пользователь со своей командной оболочкой…

Стержневым элементом языка shell является команда.

3.1. Структура команд

Команды в shell обычно имеют следующий формат:

 <имя команды> <флаги> <аргумент(ы)>

Например:

 ls -ls /usr/bin
lsимя команды выдачи содержимого директория,
-lsфлаги ( «-» — признак флагов, l — длинный формат, s — об’ем файлов в блоках).
/usr/binдиректорий, для которого выполняется команда.

Эта команда выдаст на экран в длинном формате содержимое директория /usr/bin, при этом добавит информацию о размере каждого файла в блоках.

К сожалению, такая структура команды выдерживается далеко не всегда. Не всегда перед флагами ставится минус, не всегда флаги идут одним словом. Есть разнообразие и в представлении аргументов. К числу команд, имеющих экзотические форматы, относятся и такие «ходовые» команды, как сс, tar, dd, find и ряд других.

Как правило (но не всегда), первое слово (т.е. последовательность символов до пробела, табуляции или конца строки) shell воспринимает, как команду. Поэтому в командной строке

 cat cat

первое слово будет расшифровано shell, как команда (конкатенации), которая выдаст на экран файл с именем «cat» (второе слово), находящийся в текущем директории.

3.2. Группировка команд.

Средства группировки:

; и
<перевод строки>
определяют последовательное выполнение команд;
&асинхронное (фоновое) выполнение предшествующей команды;
&&выполнение последующей команды при условии нормального завершения предыдущей, иначе игнорировать;
||выполнение последующей команды при ненормальном завершении предыдущей, иначе игнорировать.

При выполнении команды в асинхронном режиме (после команды стоит один амперсанд) на экран выводится номер процесса, соответствующий выполняемой команде, и система, запустив этот фоновый процесс, вновь выходит на диалог с пользователем.

Например, наберем (экзотическую) команду «find» в фоновом режиме для поиска в системе , начиная от корня «/», файла с именем «conf», а затем «pwd» в обычном режиме. На экране этот фрагмент будет выглядеть следующим образом:

--------------------------------
| $ find / -name conf -print & | ввод команды "find"
| |
| 288 | номер (PID) фонового процесса
| |
| $ pwd | ввод команды "pwd"
| |
| /mnt/lab/asu | результат работы "pwd"
| |
| $ | возвращение shell в промптер
| |
| /usr/include/sys/conf | результат работы "find"
| |
--------------------------------

Иногда необходимо, чтобы все фоновые процессы завершились, прежде чем будет выполняться какой-то расчет. Для этого служит специальная команда «wait [PID]». Эта команда ждет завершения указанного идентификатором (числом) фонового процесса. Если команда без параметра, то она ждет завершения всех фоновых процессов, дочерних для данного «sh».

Для группировки команд также могут использоваться фигурные «{}» и круглые «()» скобки. Рассмотрим примеры, сочетающие различные способы группировки: Если введена командная строка

 k1 && k2; k3

где k1, k2 и k3 — какие-то команды, то «k2» будет выполнена только при успешном завершении «k1»; после любого из исходов обработки «k2» (т.е. «k2» будет выполнена, либо пропущена) будет выполнена «k3».

 k1 && {k2; k3}

Здесь обе команды («k2» и «k3») будут выполнены только при успешном завершении «k1».

 {k1; k2} &

В фоновом режиме будет выполняться последовательность команд «k1» и «k2».

Фоновые процессы (как и теневую экономику) сложно уничтожить, поскольку традиционная команда «CTL/C» прерывает только процессы переднего плана. Для уничтожения фонового процесса надо знать его номер. При запуске фонового процесса на экран выдается число, соответствующее номеру (идентификатору) этого процесса (PID). Если этот номер забыт или надо убедиться, что этот процесс не закончен, с помощью команды

ps -aux

можно получить перечень идентификаторов процессов (PID), имена пользователей, текущее время, затраченное процессами, и т.д.

В выведенной таблице можно найти номера процессов, подлежащих уничтожению, например это «849» и «866». Тогда командой

kill -9 866 849

можно уничтожить эти процессы. При уничтожении процессов надо вы должны иметь то же имя пользователя, какое было приписано уничтожаемым процессам (или иметь имя привилегированного пользователя).

ПРЕДУПРЕЖДЕНИЕ. Если параллельно обрабатывается или создается файл с ОДНИМ именем (например, несколько пользователей вызвали в редактор один и тот же файл), то в системе продолжит существование тот вариант файла, который возвращен (записан) в систему последним. Это частая ошибка пользователей персональных компьютеров, которые редактируют один файл параллельно с нескольких экранов.

Круглые скобки «()», кроме выполнения функции группировки, выполняют и функцию вызова нового экземпляра интерпретатора shell.

Пусть мы находились в начальном каталоге «/mnt/lab/asu»

Тогда в последовательности команд

 cd ..; ls; ls

две команды «ls» выдадут 2 экземпляра содержимого каталога «/mnt/lab», а последовательность

 (cd ..; ls) ls

выдаст сначала содержимое каталога «/mnt/lab», а затем содержимое «/mnt/lab/asu», т.к. при входе в скобки вызывается новый экземпляр shell, в рамках которого и осуществляется переход. При выходе из круглых скобок происходит возврат в старый shell и в старый каталог.3.3. Перенаправление команд

Стандартный ввод (вход) — «stdin» в ОС UNIX осуществляется с клавиатуры терминала, а стандартный вывод (выход) — «stdout» направлен на экран терминала. Существует еще и стандартный файл диагностических сообщений — «stderr», о котором речь будет чуть позже.

Команда, которая может работать со стандартным входом и выходом, называется ФИЛЬТРОМ.

Пользователь имеет удобные средства перенаправления ввода и вывода на другие файлы (устройства). Символы «>» и «>>» обозначают перенаправление вывода.

ls >f1

команда «ls» сформирует список файлов текущего каталога и поместит его в файл «f1» (вместо выдачи на экран). Если файл «f1» до этого существовал, то он будет затерт новым.

 pwd >>f1

команда pwd сформирует полное имя текущего каталога и поместит его в конец файла «f1», т.е. «>>» добавляет в файл, если он непустой.

Символы «<» и «<<» обозначают перенаправление ввода.

 wc -l <f1

подсчитает и выдаст на экран число строк в файле f1.

 ed f2 <<!

создаст с использованием редактора файл «f2», непосредственно с терминала. Окончание ввода определяется по символу, стоящему правее «<<» (т. е. «!»). То есть ввод будет закончен, когда первым в очередной строке будет «!».

Можно сочетать перенаправления. Так

 wc -l <f3 >f4 и wc -l >f4 <f3

выполняются одинаково: подсчитывается число строк файла «f3» и результат помещается в файл «f4».

Средство, объединяющее стандартный выход одной команды со стандартным входом другой, называется КОНВЕЙЕРОМ и обозначается вертикальной чертой «|».

 ls | wc -l

список файлов текущего каталога будет направлен на вход команды «wc», которая на экран выведет число строк каталога.

Конвейером можно об’единять и более двух команд, когда все они, возможно кроме первой и последней — фильтры:

 cat f1 | grep -h result | sort | cat -b > f2

Данный конвейер из файла «f1» («cat») выберет все строки, содержащие слово «result» («grep»), отсортирует («sort») полученные строки, а затем пронумерует («cat -b») и выведет результат в файл «f2».

Поскольку устройства в ОС UNIX представлены специальными файлами, их можно использовать при перенаправлениях. Специальные файлы находятся в каталоге «/dev». Например, «lp» — печать; «console» — консоль; «ttyi» — i-ый терминал; «null» — фиктивный (пустой) файл (устройство).

Тогда, например,

 ls > /dev/lp

выведет содержимое текущего каталога на печать, а f1 < /dev/null обнулит файл «f1».

 sort f1 | tee /dev/lp | tail -20

В этом случае будет отсортирован файл «f1» и передан на печать, а 20 последних строк также будут выданы на экран.

Вернемся к перенаправлению выхода. Стандартные файлы имеют номера: 0 — stdin, 1 — stdout и 2 — stderr. Если вам не желательно иметь на экране сообщение об ошибке, вы можете перенаправить его с экрана в указанный вами файл (или вообще «выбросить», перенаправив в файл «пустого устройства» — /dev/null). Например при выполнении команды

 cat f1 f2

которая должна выдать на экран последовательно содержимое файлов «f1» и «f2», выдаст вам, например, следующее

 111111 222222 cat: f2: No such file or directory

где 111111 222222 — содержимое файла «f1», а файл «f2» отсутствует, о чем команда «cat» выдала сообщение в стандартный файл диагностики, по умолчанию, как и стандартный выход, представленный экраном.

Если вам не желательно такое сообщение на экране, его можно перенаправить в указанный вами файл:

 cat f1 f2 2>f-err

сообщения об ошибках будут направляться (об этом говорит перенаправление «2>») в файл «f-err». Кстати, вы можете всю информацию направлять в один файл «ff», использовав в данном случае конструкцию

 cat f1 f2 >>ff 2>ff

Можно указать не только какой из стандартных файлов перенаправлять, но и в какой стандартный файл осуществить перенаправление.

 cat f1 f2 2>>ff 1>&2

Здесь сначала «stderr» перенаправляется (в режиме добавления) в файл «ff», а затем стандартный выход перенаправляется на «stderr», которым к этому моменту является файл «ff». То есть результат будет аналогичен предыдущему.

Конструкция «1>&2» — означает, что кроме номера стандартного файла, в который перенаправить, необходимо впереди ставить «&»; вся конструкция пишется без пробелов.

<-закрывает стандартный ввод.
>-закрывает стандартный вывод.

3.4. Генерация имен файлов.

При генерации имен используют метасимволы:

*произвольная (возможно пустая) последовательность символов;
?один произвольный символ;
[…]любой из символов, указанных в скобках перечислением и/или с указанием диапазона;
cat f*выдаст все файлы каталога, начинающиеся с «f»;
cat *f*выдаст все файлы, содержащие «f»;
cat program.?выдаст файлы данного каталога с однобуквенными расширениями, скажем «program.c» и «program.o», но не выдаст «program.com»;
cat [a-d]*выдаст файлы, которые начинаются с «a», «b», «c», «d». Аналогичный эффект дадут и команды «cat [abcd]*» и «cat [bdac]*».

3.5. Командные файлы.

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

Пусть с помощью редактора создан файл с именем «cmd», содержащий одну строку следующего вида:

 date; pwd; ls

Можно вызвать shell как команду (!), обозначаемую «sh», и передать ей файл «cmd», как аргумент или как перенаправленный вход, т.е.

 $ sh cmd или $ sh <cmd

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

Более интересный и удобный вариант работы с командным файлом — это превратить его в выполняемый, т.е. просто сделать его командой, что достигается изменением кода защиты. Для этого надо разрешить выполнение этого файла.

Например,

 chmod 711 cmd

сделает код защиты «rwx__x__x». Тогда простой вызов

 cmd

приведет к выполнению тех же трех команд.Результат будет тот же, если файл с содержимым

 date; pwd; ls

представлен в виде:

 date pwd ls

так как переход на другую строку также является разделителем в последовательности команд.

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

Еще раз отметим, что shell-интерпретатор, это всего лишь одна из сотен команд ОС UNIX, имеющая равные с прочими привилегии.

В чём разница между cmd и PowerShell Windows?

C появлением Windows 7 к возможностям системы добавилась ещё одна программная оболочка для работы чистыми командами, не оформленная в графический интерфейс. С момента появления к ней всё чаще приковывают внимание сами разработчики, а в Windows 10 она вообще предлагается командной консолью по умолчанию. С каждой последующей версией Windows PSH (Пи-Эс-Эйч) обрастает всё большими возможностями. И на фоне развития Windows разница между cmd и PowerShell (Пауэр Шел) становится всё принципиальнее.

разница между cmd и powershell

почти не отличимы; внешне их можно сделать идентичными

Разница между cmd и PowerShell: не только в цветах.

Более могущественная, и столь же усложнённая. В один ряд с терминалом Линукс по своей многозадачности её ставить нельзя: мелко плавает. Но по сравнению с cmd она может гораздо больше, и это на фоне того факта, что практически всё, что может cmd, прокатит и в PowerShell. Однако для работы с shell придётся использовать уже отдельный вид команд, которые, дабы на русском не звучало косноязычно, переводчики назвали «командлетами». В отличие от cmd, в shell команды исполняются по нескольким каналам. Это значит, что выход одной команды (в смысле, командлета) может быть одновременно входом в другую. И всё потому, что командлеты  PowerShell — это вполне себе определённые объекты, представители конкретной структуры данных. Даже те командлеты, которые встречают в ответе shell на запрос пользователя. Выражаясь языком программистов, PSH — объектно-ориентированный, а cmd обрабатывает только символы или последовательность символов. Проще говоря, PowerShell позволяет работать с некоторыми программами изнутри, в режиме реального времени, интерактивно. Cmd, в сущности, может только запускать утилиты, которые в Windows уже существуют (почти все они в папке C:\Windows).

Более того, PowerShell — это вполне себе законченная среда для написания и исполнения скрипта. Так что можно создавать очень сложные и объёмные скрипты для управления системой, чем те, на какие была способна консоль cmd.

Основная разница между PowerShell и cmd в том, что последняя — это обновлённая версия «отжившей» в своё время программной оболочки DOS, а в первую, как видно, Windows вдыхает новую жизнь. Очевидно демонстрируя, что от DOS команд разработчики отказываться вообще не собираются. Сравнение с DOS уже неверно, та очень ограничена в своих возможностях; cmd существовала в Windows как «наследие DOS для избранных» или ремонтный, прямой вариант самых необходимых команд. А ввод в работу PowerShell — это как своеобразное предложение, если не покопаться во внутренностях системы, то поучаствовать в изучении её возможностей и способ заняться её модификацией вполне официально: интеграция в среду .Net тому подтверждение.

Разница между cmd и PowerShell: а зачем нужен Shell обычному пользователю?

Точнее, зачем нужнА. Да, чтобы переформировывать дисковое пространство или пинговать смартфон достаточно возможностей cmd. И тот факт, что shell-язык потребует более основательного подхода при использовании командлет, это выводит работу с этой оболочкой на более высокий уровень. Но абстрактность разводить не будем, а я постараюсь впоследствии разбавить статью конкретными примерами в ссылках. Согласитесь, всё зависит от конкретных задач. И нужно признаться, овладеть shell можно только после близкого знакомства с конкретными командлетами.

Знакомство с PowerShell.

Итак, на компьютерном языке Shell — это пользовательский интерфейс, который позволяет получить доступ к службам самой ОС-и. Этот shell может иметь и вариант консоли (как мы его знаем), а может иметь и более дружелюбный интерфейс — оформленный в окна с кнопочками, по которым можно тыцкать мышкой (PowerShell ISE). Windows PowerShell работает именно с ОС от Microsoft последних версий, основан на среде .NET framework. Первая версия Windows PSH появилась почти сразу после выпуска Windows XP, в ноябре 2006 г. Его основное призвание — автоматизация ежедневных задач и процессов, запускаемых администратором системы.

Можно выделить несколько первых команд, с помощью которых можно познакомиться с оболочкой в общих чертах (а не просто смотреть на пустую консоль с синюшним фоном).
Get-help

Справка как она есть. Русифицирована. Информацию о командах получаем отсюда.

Get-Command

Основные командлеты PSH. Сама по себе командлет вам не даст ничего, однако для начала можно было бы ознакомиться с её именем и исполнительным модулем. Например, если нужно увидеть командлеты, работающие с IP функциями или просто сетевые командлеты, мы можем попросить у get-command:

Get-Command –Name *IP*

Остановлюсь. Командлетов сотни, а может и тысячи. Понимая это, Microsoft ввела в работу целый сервис, который позволяет в режиме онлайн компоновать атрибуты команд в командлеты и проверять их работоспособность. Знакомьтесь: Windows PowerShell Command Builder.

Успехов.

Программирование на языке командного интерпретатора - shell

ИНТЕРПРЕТАТОР КОМАНД SHELL

Введение

   Когда пользователи входят в систему UNIX,  они общаются с одним из интерпретаторов команд. В этой главе изучается интерпретатор команд Shell, sh. Этот интерпретатор является программой UNIX, которая  поддерживает обладающий большими возможностями командный язык. Каждый вызов этого интерпретатора называется оболочкой Shell; каждая оболочка выполняет единственную функцию - считывает со стандартного  устройства ввода команду и выполняет ее.
Поскольку Shell дает пользователю возможность общаться с операционной системой на языке высокого уровня, UNIX может выполнять задачи, недоступные менее сложным операционным системам. Команды, которые обычно должны писаться на традиционных языках  программирования, здесь могут быть записаны в нескольких строчках процедуры Shell. В других операционных системах команды  выполняются  в прямой последовательности.  В UNIX благодаря Shell команды могут:

 

  •  объединяться для образования новых команд;
  •  передавать позиционные параметры;
  •  добавляться или переименоваться пользователем;
  •  выполняться внутри циклов или по определенному условию;
  •  создаваться  для локального выполнения без риска вступления в конфликт с командами других пользователей;
  •  выполняться в фоновом режиме.Более того, команды могут перенаправлять ввод исходных данных для команды от одного источника к другому и перенаправлять  вывод в файл, на терминал, принтер или другой команде. Это обеспечивает необходимую гибкость при выполнении конкретных задач.  

    Основные положения

       Shell сам по себе (т.е. программа, которая считывает ваши команды при входе в систему или которая вызывается по  команде  sh) является программой,    написанной  на  языке Си; она не является частью операционной системы,  а может рассматриваться как обычная пользовательская программа.

     

    Как создаются командные оболочки

       В системе  UNIX  процесс - это выполняющийся набор инструкций со всеми необходимыми входными данными и выводом результатов. Все процессы существуют  независимо и могут запускать (или порождать) другие процессы. Так, в каждый конкретный момент может выполняться несколько процессов, некоторые из которых могут быть "потомками" по отношению к другим процессам.
    При загрузке пользователей в операционную систему каждому выделяется своя командная оболочка,  в которой  он  работает.   Эта оболочка является   его персональной копией интерпретатора команд Shell, который  считывает команды с клавиатуры. В таком контексте Shell является просто еще одним процессом.
    В многозадачной среде UNIX файлы могут создаваться в активной фазе и   затем  пересылаться для обработки в фоновом режиме.  Это позволяет пользователю продолжать работу в то время как программа
    выполняется.

     

    Команды

       Наиболее простой  способ использования Shell - это ввод простых команд с клавиатуры.  Простая команда - это любая  последовательность аргументов,   разделенных пробелами или знаками табуляции. Первый  аргумент (с порядковым номером  0)   определяет  имя команды, которая  должна быть выполнена. Все остальные аргументы, за некоторыми исключениями,  передаются этой команде.   Например, чтобы вызвать  печать на принтер файлов с именами allan,  barry и calvin можно дать следующую команду:

    lpr allan barry calvin

       Если первый аргумент команды определяет имя  файла, который помечен выполняемым  (что определяется по значениям соответствующих битов разрешения этого файла)  и действительно является скомпилированной программой, то Shell, как родитель, создает процесс-потомок, который немедленно начинает выполнять эту программу. Если файл помечен как выполняемый,  но не является скомпилированной программой, то  предполагается,  что это процедура  Shell,   т.е. обычный текстовый  файл,  содержащий строки с командами Shell.  В этом случае Shell образует еще один интерпретатор команд (называемый подоболочкой,   субоболочкой) для чтения файла и выполнения команд внутри этой подоболочки.
    С точки  зрения  пользователя,   скомпилированные программы и процедуры Shell вызываются абсолютно одинаково. Shell сам определяет тип файлов, что обеспечивает стандартность вызова.

     

    Как Shell находит команды

       Обычно интерпретатор  Shell  ищет команды,  которые требуется выполнить в трех конкретных  местах  файловой  системы.   Сначала Shell пытается использовать имя команды в том виде,  как оно указано. Если  команда не найдена, то к имени добавляется /bin. Если это не помогает, по добавляется /usr/bin. Это означает, что поиск по порядку производится сначала в текущем каталоге, затем в каталоге /bin и после этого в каталоге /usr/bin. Например, команды pr и man могут быть на самом деле файлами с полными именами  /bin/pr и /usr/bin/man.    Можно указывать и более сложные пути для того, чтобы или поместить файл в конкретное место относительно текущего каталога пользователя,  или чтобы обращаться к команде по ее полному имени. Если в команде имеется косая черта (/) (например /bin/sort dir/cmd),   то к имени никаких путей для поиска добавляться не будет.
    Поскольку текущий   каталог  обычно  просматривается  первым, пользователь может хранить в нем свою личную модификацию программы, которая    не  будет влиять на выполнение программ с таким же именем другими   пользователями.   Конкретная  последовательность просмотра каталога  может быть изменена переопределением переменной PATH. (Переменные Shell будут рассматриваться позднее.)

     

    Генерация списка аргументов

       Аргументами в командах очень  часто  являются  имена  файлов. Иногда эти файлы имеют похожие,  но неодинаковые имена. Чтобы использовать схожесть имен,  Shell позволяет пользователю применять шаблоны, которые    соответствуют именам файлов в каталоге.  Если шаблон соответствует одному или нескольким именам файлов в  каталоге, то  эти файлы автоматически будут рассматриваться интерпретатором Shell как аргументы для команды.
    Большинство символов  в  таких шаблонах обозначают сами себя, но в UNIX существуют также и специальные символы,  которые  можно включать в шаблоны. Ими являются:

  •  звездочка (*), обозначающая любую последовательность символов, включая и последовательность нулевой длины;
  •  знак вопроса (?), который соответствует любому символу;
  •  квадратные скобки ([ ]),  означающие любой из заключенных в них символов.
    Внутри квадратных скобок пара символов, разделенных дефисом, соответствует любому символу из определяемого ими диапазона. Например, [a-de] эквивалентно [abcde].
    Примеры использования метасимволов:

    Метасимвол
    Значение
    *Соответствует любому имени в текущем каталоге
    *temp*Соответствует всем именам; содержащим ‘temp’
    [a-f]*Соответствует всем именам начинающимся на a;b;c;d;e;f
    *.cСоответствует всем именам с расширением `c`
    /usr/bin/?Все имена файлов в каталоге /usr/bin; из одного символа

       Использование шаблонов  позволяет  избежать  лишнего  ввода с клавиатуры, и, что более существенно, дает возможность объединять связанные между  собой  информационные файлы в группы,  используя общие символы в именах или расширениях.
    Вместе с  тем на использование шаблонов накладываются некоторые ограничения. Если имя файла начинается с точки (.), оно может заменяться только аргументом, тоже начинающимся с точки.
    Следует заметить, что имена каталогов не должны включать в себя следующие символы:
    * ? [ ]

     

    Использование кавычек

       Имеется несколько символов, которые имеют в Shell специальное значение. Это  <, >, *, ?, [ и ]. Чтобы отменить специальное значение этих символов, требуется заключать их особым образом в одинарные (')  или двойные (") кавычки.  То же действие в отношении одиночного символа  выполняет обратная наклонная черта (\).  (Обратные одинарные кавычки (`)  используются только  для  командной подстановки в Shell и не отменяют специальных значений символов.)
    Все символы, заключенные в одинарные кавычки, воспринимаются как обычные текстовые символы. Например, строка:

    echostuff='echo $? $*; ls *| wc'

    только присваивает переменной echostuff значение

    echo $? $*; ls *| wc

    но не вызывает выполнение ни одной из команд.
    Внутри двойных кавычек специальное значение сохраняется только у некоторых символов - это $\` и ". В результате внутри двойных кавычек имеет место подстановка значений переменных и команд. Однако, сами по себе двойные кавычки никак не влияют на подставляемые команды, и поэтому такие символы, как *, сохраняют свое специальное значение.
    Чтобы отменить специальное значение символа $ и одинарных и двойных кавычек внутри двойных кавычек, перед ними требуется до полнительно указывать символ \. Вне двойных кавычек указание символа \ перед специальным символом адекватно заключению этого специального символа в одинарные кавычки. Символ \, стоящий перед символом новой строки, обозначает игнорирование этого символа. Благодаря этому можно продлевать командную строку.
    Ниже приводятся несколько примеров использования кавычек:

    Ввод
    Интерпретация
    ‘`’обратная кавычка
    ‘»‘двойная  кавычка
    ‘`echo one`’одно слово ‘`echo one`
    ‘\»‘двойная кавычка
    ‘`echo one`’слово one
    ‘`’cинтаксическая ошибка
    one twoдва слова one и two
    ‘one two’одно слово ‘one two’
    ‘one two’одно слово ‘one two’
    ‘one * two’одно слово ‘one * two’
    ‘one * two’одно слово ‘one * two’
    `echo one`одно слово ‘one’

    Стандартный ввод/вывод

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

  •  файл "стандартного" ввода
  •  файл "стандартного" вывода
  •  файл "диагностического" вывода (файл ошибок)
    Каждому из этих файлов соответствует число, называемое дескриптором файла. Принято, что дескриптор 0 соответствует стандартному вводу, 1 - стандартному выводу и  дескриптор 2 - диагностическому выводу. Процессы-потомки, как правило, берут эти файлы из "родительского" процесса. Первоначально все три файла подключены к терминалу (0 - к клавиатуре, 1 и 2 - к экрану). Интерпретатор команд Shell позволяет перенаправлять файлы до того, как управление будет передано вызванной команде.
    Аргументы для интерпретатора, записанные в форме <file или >file, открывают файлы с указанными именами в качестве устройств стандартного ввода или вывода (в случае вывода старое содержимое файла с указанным именем, если он существовал ранее, будет уничтожено). Аргумент, записанный в виде >>file, направляет стандартный вывод в конец файла, тем самым давая возможность добавлять данные к уже существующему файлу, не разрушая его содержимого. В последних двух случаях Shell создает файл с указанным именем, если он не существовал до этого. Таким образом, команда:

    > output

    создает файл нулевой длины. Следующая команда добавляет в файл с именем log список пользователей, работающих в данный момент в системе:

    who >> log

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

    echo 'this is a test' > *.gal

    создает файл с именем *.gal, содержащий одну строку. В случае, если вы, например, дадите команду:

    cat < ?

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

     

    Диагностика и другие виды вывода

       Диагностический вывод от команд UNIX обычно направляется в файл, имеющий дескриптор 2. (Часто возникает необходимость иметь файл, куда выводятся сообщения об ошибках, который отличается от стандартного вывода, для того, чтобы сообщения об ошибках не оказались потерянными). Вы можете перенаправить вывод ошибок в файл, указав номер дескриптора файла (2 в нашем случае) непосредственно перед любым из символов переадресации (> или >>). Приводимая ниже команда добавляет сообщения об ошибках от команды cc в файл с именем ERRORS:

    cc testfile.c 2>> ERRORS

       Обратите внимание на то, что между дескриптором файла и стрелками не должно быть никаких пробелов или символов табуляции - в противном случае число будет передано  в  качестве аргумента команды.
    Этот метод может быть обобщен для осуществления переадресации вывода, связанного с любыми из первых десяти дескрипторов файлов (с номерами от 0 до 9). Например, если вывод команды cmd идет на дескриптор 9, то следующая командная строка перенаправляет этот вывод в файл savedata:

    cmd 9> savedata

       Команды как правило генерируют стандартный вывод и вывод ошибок, но могут быть также другие типы вывода, например, файл данных. В этом случае можно независимо друг от друга перенаправить все различные разновидности вывода. Предположим, например, что cmd направляет свой стандартный вывод в файл с дескриптором 1, сообщения об ошибках - в файл с дескриптором 2 и создает файл данных с дескриптором 9. Приводимая ниже команда направляет каждый из этих выводов в различные файлы:

    cmd >standard 2> error 9> data

    Командные строки и конвейеры

       Последовательность команд, разделенных вертикальными чертами (|), образует конвейер. В конвейере, состоящем более чем из одной команды, каждая команда выполняется как отдельный процесс, связанный с соседними с помощью программных каналов - т.е. вывод каждой команды (за исключением последней) становится вводом для следующей команды в строке.
    Фильтр - это команда, которая считывает стандартный ввод, преобразует его некоторым образом и затем записывает в  стандартный вывод. Конвейер, как правило, состоит из последовательности фильтров. Несмотря на то, что процессы в конвейере могут выполняться параллельно, каждой программе необходимо прочитать вывод предыдущей. Многие команды работают с отдельными строками текста - считывают их, обрабатывают, записывают и возвращаются назад для считывания новых строк. Некоторые команды должны наоборот сначала считать большой объем данных и потом только начинают выводить результаты - sort является примером такой команды, которой требуется вначале считать все входные данные и затем только будет проводиться обработка. Вот пример типичного конвейера:

    nroff -mm text| col| lpr

       Здесь nroff - это форматер текста, имеющийся в Системе Обработки Текстов UNIX, col - преобразует вывод для конкретного типа дисплея и lpr осуществляет печать текста. Флаг '-mm' обозначает одну из наиболее часто употребляемых опций форматирования, и text - это имя файла, который должен быть отформатирован.
    Следующие примеры демонстрируют множество возможностей, которые могут быть получены комбинированием команд описанными выше способами. Попробуйте выполнить их:

    who

         Печатает на экране список зарегистрированных в системе пользователей.

    who >> log

         Добавляет список загруженных пользователей в конец файла log.

    who| wc -l

         Печатает количество зарегистрированных пользователей.

    who| pr

         Постранично печатает список пользователей.

    who| sort

         Печатает список пользователей в алфавитном порядке.

    who| grep bob

         Печатает список пользователей, чьи имена содержат слово bob.

    who| grep bob| sort| pr

         Печатает постранично в алфавитном порядке список пользователей, чьи имена содержат слово bob.

    { date;who | wc -l; } >> log

         Добавляет в файл log текущую дату и количество зарегистрированных в системе пользователей. Обратите внимание на пробелы после левой фигурной скобки и перед правой  фигурной скобкой.

    who| sed -e 's/ .*//'| sort| uniq -d

         Печатает имена только тех пользователей, которые регистрировались в системе более одного раза. Обратите внимание на использование sed в качестве фильтра для удаления символов, стоящих после имени пользователей.
    Команда who сама  по себе не имеет возможности получать все эти результаты - их можно получить только объединив who с другими командами. Команда who в этих примерах служит как источник информации. В качестве упражнения замените "who|" на "</etc/passwd" и убедитесь в том, что файл может также быть использован как источник данных. Помните, что аргументы переадресации могут находиться в любом месте в командной строке, даже в самом ее начале. Это значит, что конвейер

    < infile >outfile sort| pr

    аналогична

    sort < infile |pr >outfile

    Командная подстановка

       Любая командная строка может быть помещена  внутрь обратных кавычек (`....`), в результате чего вывод этой командной строки заменит при выполнении саму эту строку. Это называется командная подстановка. Команда или команды, заключенные в обратные кавычки, обрабатываются Shell в первую очередь и их вывод заменяет сами эти команды и обратные кавычки. Это свойство часто используется для присвоения значений переменным Shell. (Переменные Shell рассматриваются в следующем разделе.)
    Например:

    today=`date`

    присваивает строку со значением текущей даты переменной today (например "Tue Nov 26 16:01:09 EST 1985"). Следующая команда сохраняет число зарегистрированных в системе пользователей в переменной users:

    users=`who | wc -l`

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

    logmsg=`echo Your login directory is \`pwd\``

    покажет строку Your login directory is ...(имя вашего каталога). Переменным Shell также можно присваивать значения, используя команды read и line.  Команда read считывает строку из стандартного ввода (обычно с терминала) и присваивает отдельные слова всем указанным переменным.
    Например, предположим, что команда:

    read first init last

    прочитала строку вида:

    G. A. Snyder

    Тогда указанным переменным будут присвоены значения:

    first=G. init=A. last=Snyder

       Все "лишние" прочитанные слова команда read присваивает последней переменной.
    Команда line считывает строку из стандартного ввода и повторяет в стандартном выводе.

     

    Переменные Shell

       В Shell имеется несколько способов создания переменных. Переменная - это имя, которому присвоено текстовое значение. Некоторые переменные являются позиционными параметрами - их  значения устанавливаются только в командной строке. Остальные переменные - это просто имена, которым пользователь или сам интерпретатор присвоил текстовые значения.

     

    Позиционные параметры

       Когда вызывается  процедура  Shell,   то  Shell  сразу неявно создает позиционные параметры.  Имя самой процедуры Shell в нулевой позиции   в командной строке присваивается позиционному параметру $0.  Первый аргумент команды называется $1 и т.д. Чтобы получить доступ  к аргументам в позициях с номером больше 9,  можно использовать команду shift.  Например,  следующую процедуру можно использовать для просмотра позиционных параметров и затем обрабатывать все необходимые файлы:

     while test -n "$1" do case $1 in -a) A=aoption ; shift;; -b) B=boption ; shift;; -c) C=coption ; shift;; -*) echo "bad option" ; exit 1 ;; *) process rest of files esac done

       Пользователь может явно передать  необходимые  значения  этим позиционным параметрам с помощью команды set. Например, команда:

    set abc def ghi

    присваивает значение  "abc"  первому  позиционному  параметру $1, значение "def" - второму $2 и "ghi" - третьему $3.  Нулевой позиционный параметр  $0  нельзя  переопределить  таким способом - он всегда относится к имени процедуры Shell.

    Переменные, определяемые пользователем

    Интерпретатор Shell  также распознает буквенно-цифровые переменные, которым  присвоены текстовые значения.   Простая  команда присвоения имеет синтаксис:

    имя=строка

       После присвоения  при указании $имя будет выдаваться значение строки. Имя переменной - это последовательность букв, цифр и знаков подчеркивания,    обязательно  начинающееся с буквы или знака подчеркивания. Пробелы вокруг знака равенства (=) в команде присваивания недопустимы.  Позиционные параметры таким способом определить нельзя; они могут устанавливаться только командой set.
    В команде  присвоения может быть более одного присвоения,  но помните, что Shell присваивает значения переменным справа налево.
    Так, в результате выполнения следующей командной строки:

    A=$B B=abc

    переменной А будет присвоено значение "abc".
    Ниже приводятся примеры простых присвоений. Двойные кавычки с правой стороны   команды  присвоения позволяют указывать пробелы, знаки табуляции, символы перехода на новую строку и точки с запятой в  присваиваемом тексте,  а также выполнять подстановку переменных. Это  значит, что при обнаружении позиционных параметров и других имен  переменных,  перед которыми стоит знак $,  они будут заменяться на соответствующие значения, если они имеются. Одинарные кавычки подавляют подстановку переменных:

     MAIL=/usr/mail/gas echovar="echo $1 $2 $3 $4" stars=***** asterisks='$stars'

       В приведенных примерах переменной echovar присвоено  значение строки, состоящей из слова echo и четырех позиционных параметров, разделенных пробелами. Вокруг последовательности звездочек, присваиваемых переменной stars,  кавычек не требуется, т.к. их специальное значение здесь не действует.  Обратите внимание, что переменной asterisks  присвоено  текстовое  значение  "$stars",  а не "*****", т.к. одинарные кавычки отменили подстановку.
    В командах присвоения при подстановке пробелы повторно не интерпретируются, поэтому  переменные $first и $second в  следующем примере имеют одно и то же значение:

    first='a string with embedded spaces'
    second=$first

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

    a='This is a string'echo "${a}ent test of variables."

       В данном случае команда echo напечатает:

    This is a stringent test of variables.

       Если бы  вы  не  использовали  фигурные  скобки,   то   Shell
    подставил бы пустое значение вместо "$aent" и напечатал:

    test of variables.

       Интерпретатором Shell  поддерживаются  следующие  переменные. Некоторые из них определяются и устанавливаются самим интерпретатором, но все они могут быть изменены пользователем.

    HOME  Программа login  присваивает этой  переменной  значение каталога загрузки пользователя,  т.е. каталога, который является текущим во время выполнения login; команда cd, казанная без аргументов,  переключает в каталог с именем $HOME.  Использование этой переменной позволяет  не следить за полными именами процедур Shell.
    IFS  Эта переменная определяет, какие символы являются внутренними разделителями полей. Это символы, которые Shell использует при интерпретации пробелов.  (Если вы хотите использовать какой-либо разделитель,  вы должны установить его в переменной IFS.) Интерпретатор Shell при запуске включает  в IFS символ пробела,  знак табуляции и символ новой строки.
    MAIL  Эта переменная  содержит  полное имя (с путями,  где он расположен) файла, куда приходит почта. Если переменная MAIL установлена,  то Shell проверяет, было ли что-нибудь добавлено в указанный файл и дает сообщение о  появлении новой  почты  при  каждом возврате на командный уровень (например, при выходе из редактора). Переменная MAIL автоматически  не устанавливается; если требуется, ее необходимо  установить  в   пользовательском   файле .profile. Команда  export и файл .profile рассматриваются ниже.)  (О наличии почты в стандартном файле почты сообщается при загрузке независимо от значения переменной MAIL.)
    MAILCHECK Этот  параметр определяет с какой частотой (в секундах) Shell будет проверять появление почты в файлах, указанных в параметрах MAILPATH и MAIL.  Принимаемое по умолчанию значение равно 600 секунд. Если этот параметр установлен равным  0,   то  Shell будет проверять наличие почты при каждом появлении символа приглашения.
    MAILPATH  Этот параметр содержит список имен файлов,  разделенных двоеточием. Если этот параметр установлен, то Shell информирует пользователя  о приходе почты в любой из указанных файлов.  После каждого имени файла может  стоять знак %  и  сообщение,  которое будет выводиться,  когда произойдет изменение времени модификации  этого  файла. По умолчанию выдается сообщение «You have mail».
    SHACCT  Если в этот параметр  занесено  имя  файла,  доступного пользователю для записи,  Shell будет делать в него соответствующие записи для каждой  выполняемой  процедуры Shell. Для анализа этих данных могут использоваться такие процедуры, как acctcom (ADM) и accton (ADM).
    SHELL  Когда вызывается интерпретатор Shell, он ищет эту переменную и если она имеется и в ее значении вместо  имени файла указан символ ‘r’,  то Shell загружается в укороченном виде.
    PATH  Эта переменная определяет пути, которые использует Shell при поиске команд.  Ее значение представляет собой список имен  каталогов,   разделенный  двоеточиями.  Shell присваивает переменной PATH значение  :/bin:/usr/bin, где перед  первым двоеточием ничего не указано.  Пустой аргумент в любом месте в списке путей всегда обозначает текущий каталог.   В некоторых системах поиск в текущем каталоге по умолчанию отсутствует, и поэтому переменная PATH определяется  как  /bin:/usr/bin.  Если вы хотите, чтобы текущий каталог при поиске команд  просматривался последним, а не первым, используйте:

    PATH=/bin:/usr/bin:

    В следующем примере два двоеточия,  стоящие подряд, интерпретируются как двоеточие, за которым следует пустой аргумент и двоеточие, тем самым обозначая текущий каталог. Вы  можете  создать  личный  каталог   с командами (например, $HOME/bin[color]) и задать просмотр его в первую очередь:

    PATH=$HOME/bin::/bin:/usr/bin

    Параметр PATH обычно устанавливается в файле [color=gray].profile.
    CDPATH  Эта переменная определяет пути поиска каталогов, содержащих arg.  Альтернативные имена каталогов  разделяются двоеточиями. Путь,  используемый по умолчанию, - <null> (он определяет текущий каталог).  Текущий каталог определяется нулевым  именем пути,  который можно указывать сразу после знака равенства или между двумя двоеточиями в любом  месте списка.  Если arg начинается с /, тогда поиск по путям не выполняется. В противном случае просматриваются все указанные в путях каталоги.
    PS1  Эта переменная определяет,  какое выражение следует использовать в  качестве  первичного приглашения системы. Если Shell является интерактивным, то он выдает приглашение в  виде PS1,  когда ожидается ввод.  По умолчанию PS1 присвоено значение "$ ".
    PS2  Эта переменная определяет выражение для вторичного приглашения системы.  Если интерпретатору Shell  требуется входных данных больше, чем было указано в строке, то он  выдает приглашение в виде PS2. По умолчанию PS2 присвоено значение  ">  " (знак "больше",  за которым следует пробел).
    В большинстве случаев вам необходимо передавать все указанные переменные во все интерпретаторы,  которые вы  используете.   Для этого используйте  команду export в вашем файле .profile, например:

    export HOME IFS MAIL PATH PS1 PS2

    Заранее определяемые специальные переменные

    У некоторых переменных есть специальное значение и оно  устанавливается только самим интерпретатором. Это:
    $#  Записывает количество аргументов,  переданных в Shell, несчитая имени самой вызываемой процедуры.  Например, при выполнении команды:

    sh cmd a b c 

    в $# передается номер последнего позиционного параметра и поэтому $# равно 3.  Эту переменную  можно  использовать, например, для  проверки наличия всех необходимых аргументов:

    if test $# -lt 2thenecho 'two or more args required'; exitfi

    $? - Эта переменная содержит код завершения последней   выполненной команды.  Ее значение это десятичное число.  Большинство команд  UNIX дают код возврата 0 при успешном завершении. Сам Shell возвращает  текущее  значение  $? в качестве своего кода завершения.
    $$  В этой переменной хранится номер текущего процесса.  Поскольку номера процессов среди всех выполняемых никогда не могут совпадать,  эту переменную часто используют для образования имен временных файлов. В UNIX нет механизма автоматической генерации и удаления временных файлов.  Файл существует до  тех  пор,   пока его не сотрут специально. Пользоваться временными файлами как правило  бывает  неудобно - механизм программных каналов UNIX для большинства приложений намного лучше.  Однако, потребность во временных файлах  с уникальными именами иногда все же появляется.
    Следующий пример  демонстрирует рекомендуемый способ создания временных файлов.  Обратите внимание  на  то, что  каталоги /bin  и /usr/tmp очищаются в случае перезагрузки системы.

    # применение идентификатора текущего# процесса для формирования уникального# временного файлаtemp=/usr/tmp/$$ls > $temp# здесь стоят команды, некоторые из которых# используют временные файлыrm -f $temp# стирание в конце работы

    $!  Номер последнего процесса,  который выполнялся  в фоновом режиме. Это число, содержащее от 1 до 5 цифр.
    $-  Это переменная, состоящая из имен флагов, включенных в данный момент в Shell.

    Состояние Shell
    ————————————————————-

    Состояние Shell в каждый момент времени определяется значениями позиционных параметров,  переменных, определенных пользователем, переменными  операционной системы,  режимом работы и текущим рабочим каталогом.
    Состояние Shell может быть изменено различными способами. Они включают в себя смену текущего каталога с помощью команды cd, установку флагов и чтение команд из  специального  файла  .profile, находящегося в вашем загрузочном каталоге.

    Смена каталогов

    Команда cd  меняет каталог на тот,  который указан в качестве аргумента. Ее можно и нужно использовать для перехода в требуемое место в структуре каталогов.  Обратите внимание, что cd часто помещают внутри скобок, чтобы приказать подоболочке сменить каталог и выполнить какие-либо команды,  не затрагивая основную оболочку.
    Например, первая из приводимых ниже команд копирует файл /etc/passwd в /usr/you/passwd, а вторая сначала меняет каталог на /etc и затем копирует файл:

    cp /etc/passwd /usr/you/passwd
    (cd /etc; cp passwd /usr/you/passwd)

       Обратите внимание на скобки.  Обе строки имеют одинаковый эффект.
    Если интерпретатор считывает команды с терминала и указанного каталога не существует (или доступ запрещен),  то проводится  попытка коррекции каждого компонента имени каталога в поисках "правильного" имени. После этого Shell спрашивает разрешения на переход в каталог с исправленным именем: ответ "n" означает запрет, а любой другой символ разрешает.

    Файл .profile

    Файл с именем .profile считывается каждый раз,  когда вы загружаетесь в UNIX. Он обычно используется для выполнения специальных команд   и для установки и передачи переменных во все подоболочки. Только после того, как все команды из файла .profile будут считаны и выполнены,  Shell начнет считывание команд из стандартного ввода — обычно с терминала.
    Если вы хотите произвести переустановку параметров среды после внесения изменений в файл .profile, введите:

    .profile

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

    Флаги выполнения

    Команда set позволяет вам изменять поведение Shell путем  установки определенных   флагов.  В частности,  флаги -x и -v могут быть полезны при вызове Shell как команды с терминала.  Эти флаги можно установить командой set:

    set -xv

    Те же самые флаги можно выключить командой:

    set +xv

    Эти два флага имеют следующее действие:
    -v  Вводимые  строки  печатаются  так,  как  они  считываются Shell'ом. Этот флаг удобен для устранения  синтаксических ошибок. Команды  на  каждой  введенной строке выполняются после того, как она будет напечатана.
    -х  Команды и их аргументы печатаются по мере  их выполнения. (Команды управления Shell, такие как forwhile и т.д. не печатаются.) Обратите внимание,  что -х вызывает  трассировку только тех команд,  которые выполняются, а -v печатает всю командную строку,  пока не встретится  синтаксическая ошибка.

    Команда set также  используется  для установки этих и других флагов в процедурах Shell.

    Среда выполнения команд
    ————————————————————-

    Все переменные и их значения,  которые известны команде перед выполнением, образуют ее оболочку (среду выполнения). Эта оболочка включает в себя переменные,  которые команда получает «по наследству» от родительского процесса,  и переменные,  указанные как ключевые параметры в командной строке, которая запускает команду.
    Переменные, которые Shell передает дочернему процессу  —  это переменные, перечисленные как аргументы в команде export. Эта команда помещает указанные переменные в оболочки как самого  Shell, так и всех его будущих дочерних процессов.
    Ключевые параметры — это пары  переменная-значение,   которые появляются в   форме присвоений,  обычно перед именем процедуры в командной строке. Такие переменные помещаются в оболочку вызываемой процедуры. Например:

    # keycommandecho $a $b

       Это пример простой процедуры,  которая выводит значения  двухпеременных. Если ее вызвать следующим образом:

    a=key1 b=key2 keycommand

    то результирующий вывод будет:

    key1 key2

       Ключевые параметры не являются аргументами и не изменяют $#.
    Процедура имеет доступ к значению любой  переменной  в  своей оболочке. Однако,  даже если значение переменной было изменено, эти изменения не отражаются на параметрах  Shell;  они  относятся только к конкретной процедуре. Для того, чтобы эти изменения были переданы в дочерние процессы данной  процедуры, эти переменные должны быть перечислены в команде export в этой процедуре.  Чтобы получить список переменных, которые являются передаваемыми из текущего интерпретатора Shell, введите:

    export

       Вы также получите список переменных, которые  можно  только считывать. Чтобы  получить список пар имя-значение в текущей оболочке, введите:

    printenv

    или

    env

    Вызов интерпретатора Shell
    -------------------------------------------------------------

    Shell —  это команда и она может быть вызвана также как и любая другая команда:
    sh proc [arg…]      Новая копия Shell вызывается для чтения proc.
    sh -v proc [arg…]   Это эквивалентно помещению «set -v» в начале proc. Также можно указывать флаги -x, -e, -u, -n.
    proc [arg…]         Если proc  является выполняемым файлом, а не скомпилированной  программой, то эффект будет такой же, как от команды:

    sh proc args

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

    Передача параметров в процедуры Shell
    ————————————————————-

    Когда просматривается командная строка,  любая последовательность символов в виде $n заменяется на n-ный аргумент Shell, считая имя процедуры как $0.  Такое соглашение позволяет производить прямое обращение к имени процедуры и к позиционным параметрам (не более 9).  Дополнительные аргументы можно обрабатывать, пользуясь командой shift или используя цикл for.
    Команда shift сдвигает аргументы влево,  т.е. значение $1 теряется, $2  заменяет $1,  $3 заменяет $2 и т.д. Позиционный параметр с наибольшим номером становится неопределенным  ($0  никогда не сдвигается). Например, в приводимой ниже процедуре ripple, команда echo записывает свои аргументы в стандартный вывод:

     # команда ripple while test $# != 0 do echo $1 $2 $3 $4 $5 $6 $7 $8 $9 shift done

       Строки, начинающиеся с #, являются комментариями. Команда цикла while рассматривается в пункте "Условные циклы: while и until" в этой главе.  Если эта процедура будет вызвана таким способом:

     ripple a b c

    то она напечатает:

     ---------------------------------------------------------
    ¦ a b c
    ¦ b c
    ¦ c

       Специальная переменная "звездочка" ($*) вызывает подстановку всех позиционных параметров, кроме $0. Так, строку с командой echo в последнем примере можно записать намного компактнее:

     echo $*

       Эти две записи команды echo неэквивалентны полностью. Первая печатает максимум девять позиционных параметров, а вторая печатает все текущие позиционные параметры. Переменная ($*) более емкая и подвержена ошибкам в меньшей степени. Один из способов ее использования состоит в передаче команде произвольного числа аргументов. Например, команда:

     wc $*

    подсчитывает слова в каждом из  файлов, указанных в командной строке.
    Важно понимать последовательность действий, выполняемых Shell'ом при просмотре командной строки и выполнении подстановок. Shell сначала считывает ввод до символа новой строки или точки с запятой и затем выполняет анализ считанной части ввода. Переменные заменяются своими значениями и затем делается командная подстановка (через обратные кавычки). Затем определяются, обрабатываются и удаляются из строки аргументы, переадресующие ввод-вывод. После этого  Shell просматривает получившуюся командную строку и ищет внутренние разделители полей, т.е. все символы, определенные в IFS и разделяющие командную строку на отдельные аргументы. Пустые аргументы (определенные в виде "" или '') сохраняются, а остальные пустые аргументы, полученные в результате оценки переменных, которые являются нулевыми или не определены, удаляются. Затем происходит формирование имен файлов по указанным шаблонам. И только после этого командная строка выполняется интерпретатором.
    Иногда командные строки создаются внутри процедур Shell. В этом случае бывает полезно заставить Shell повторно просмотреть командную строку после выполнения подстановок. Для этих целей имеется специальная команда eval. Она считывает командную строку в качестве своего аргумента, выполняет все подстановки и печатает ее. Рассмотрим следующий пример:

     command=who output=' | wc -l' eval $command $output

       Эта часть процедуры выведет на экран получившуюся строку:

     who | wc -l

       Использование команды eval может быть вложенным, при этом командная строка просматривается несколько раз.

     

    Управление потоком выполнения

       Shell имеет несколько команд, которые используют множество управляющих структур, полезных при управлении потоком выполнения процедур. Перед тем как описывать эти структуры, необходимо определить некоторые термины.
    Простая команда - это любая неделимая команда, определяемая именем выполняемого файла. Аргументы переадресации ввода-вывода могут указываться в простых командах и они передаются интерпретатору, а не самой команде.
    Команда - это простая команда или любая из управляющих команд Shell, описанных ниже. Конвейер - это последовательность из одной или более команд, разделенных вертикальными чертами (|). В конвейере стандартный вывод каждой команды,  кроме последней, соединен посредством программного канала со стандартным вводом следующей команды. Каждая   команда в конвейере выполняется отдельно; Shell ждет завершения последней команды. Код завершения конвейера равен коду завершения последнего процесса в конвейере.
    Список команд - это последовательность из  одного  или  более конвейеров, разделенных  точками с запятой (;), амперсандами (&), символами "и-если" (&&)  или "или-если" (||)   и  заканчивающаяся (необязательно) точкой с запятой или амперсандом. Точка с запятой вызывает последовательное выполнение предыдущего конвейера. Это значит, что  Shell ждет конца выполнения конвейера и только после этого считывает следующий. С другой стороны, амперсанд вызывает асинхронное выполнение   в  фоновом режиме предыдущего конвейера. Таким образом допускаются как последовательное, так и фоновое выполнение. Фоновый конвейер продолжает выполнение до тех пор, пока не завершится самостоятельно или будет уничтожен.
    Другие области  применения амперсанда включают в себя фоновую компиляцию и создание заданий, которые будут пересылаться другим компьютерам. Допустим, вы ввели:

    nohup cc prog.c&

       Вы можете продолжать работать в то время как Си-компилятор выполняется в фоновом режиме. Командная строка, заканчивающаяся амперсандом, защищена от прерываний и выхода, которые вы указываете, набирая с клавиатуры INTERRUPT или QUIT. Только одновременное нажатие клавиш Ctrl-d может снять команду в случае, если вы работаете через коммутируемую линию или имеете stty hupcl. В этом случае мы также советуем устанавливать защиту от прерываний. Для этого используется команда nohup. Допустим, что в  приведенном примере вы не указали nohup, тогда если вы выходите из подзадачи до того, как завершится процесс сс, он будет уничтожен со всем своим выводом.
    Амперсанд нужно применять с ограничениями,  особенно в сильно загруженных системах. В противном случае возникнут претензии со стороны других пользователей, если вы будете запускать много процессов в фоновом режиме без достаточных на то оснований.
    Операторы "и-если" и "или-если" (&& и ||) вызывают выполнение конвейеров при соответствии определенных условий.  Оба эти оператора имеют одинаковый приоритет при расшифровке командной строки, но меньший,  чем  у амперсанда и вертикальной черты.  В командной строке:

    cmd1 || cmd2

    первая команда cmd1 выполняется и анализируется ее  код  завершения. Команда cmd2 выполняется только в том случае, если сmd1 завершилась с кодом, не равным 0. Т.е. это является краткой записью следующих команд:

     if cmd1 test $? !=0 then cmd2 fi

       Оператор "и-если" (&&) выполняет проверку на равенство. Например, в командной строке:

     cmd1 && cmd2

    вторая команда выполняется только в том случае, если первая завершилась успешно (код завершения равен 0). В следующей строке каждая команда выполняется по очереди до тех пор,  пока какая-нибудь не закончится с кодом, не равным 0:

     cmd1 && cmd2 && cmd3 && ... && cmdn

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

    { nroff -mm text1; nroff -mm text2; } | lpr

       Обратите внимание на то, что после левой скобки необходим пробел, а перед правой должна стоять точка с запятой.

    7-28

     

    Использование оператора if

       Shell позволяет структурировать условные переходы с помощью оператора if. Простейшая форма оператора if следующая:

     if список команд then список команд fi

       Список команд, стоящий после if, выполняется, и если код завершения последней выполненной команды равен 0, тогда выполняется список команд, указанный после then. Слово fi обозначает конец команды if.
    Чтобы выполнить альтернативный набор команд при ненулевом коде завершения, используется условие else, которое записывается cледующим образом:

     if список команд then список команд else список команд fi

       Используя условие elif вместе с командой if, можно выполять различные условия, но при большом количестве проверок редпочтительнее использовать оператор case. Например:

     if test -f "$1" # является ли $1 файлом? then pr $1 elif test -d "$1" # если нет, то является ли $1 каталогом? then (cd $1; pr *) else echo $1 не является ни файлом, ни каталогом fi

       Приведенный пример выполняется следующим образом: если значение первого позиционного параметра является именем файла (-f), то этот файл печатается; если нет,  то проверяется, является ли это имя именем каталога (-d). Если это так, то вы переходите в этот каталог (cd) и печатаете все находящиеся в нем файлы ( pr *). Во всех остальных случаях появляется сообщение об ошибке.
    Команды if могут вкладываться друг в друга, но каждый if обязательно должен иметь свой fi.
    Кодом завершения команды if является код завершения последней выполненной команды после условий then и else. Если команды не выполнялись, то код завершения равен 0.
    Обратите внимание, что вместо указания команды test можно ис-
    пользовать альтернативное обозначение -  прямоугольные  скобки  с
    заключенным в  них проверяемым выражением.  Например,  предыдущий
    пример можно было записать так:

    if    [ -f «$1» ]
    #     является ли $1 файлом?
    then  pr $1
    elif  [ -d «$1» ]
    #     если нет, то является ли $1 каталогом?
    then  (cd $1; pr *)
    else  echo $1 не является ни файлом, ни каталогом
    fi

    Обратите внимание  на то,  что при такой форме записи пробелы
    после левой скобки и перед правой обязательны.

    Использование оператора case

    Оператор case также дает возможность проверять различные  ус-
    ловия. Основной формат оператора case следующий:

    case  подстрока  in
    шаблон ) cписок команд ;;
    ….
    шаблон ) cписок команд ;;
    esac

    Shell пытается  найти указанную подстроку по очереди в каждом
    шаблоне, используя  те же самые соглашения,  что и при  генерации
    имен файлов. Если соответствие установлено, то выполняется список
    команд после этого шаблона. Два символа точки с запятой (;;) слу-
    жат обозначением  конца оператора case и необходимы после каждого
    шаблона кроме последнего. Обратите внимание на то, что только од-
    но значение шаблона (из указанных)  может обнаружиться в подстро-
    ке, что сравнение с шаблонами выполняется последовательно, и поэ-
    тому если первым шаблоном выступает звездочка (*),  все остальные
    значения игнорируются.

    7-30

    С одним  и тем же списком команд может быть связано несколько
    альтернативных шаблонов, разделенных символом (|).

    case $i in
    *.c)  cc $i
    ;;
    *.h | *.sh)
    : do nothing
    ;;
    *)    echo «$i of unknown type»
    ;;
    esac

    В этом примере для второго набора шаблонов не выполняется ни-
    каких действий,  т.к.  указана пустая команда (:).  Звездочка ис-
    пользуется как шаблон, соответствующий любому слову.
    Код завершения оператора case равен коду завершения последней
    выполненной команды.  Если никакие команды не выполнялись, то код
    завершения равен 0.

    Условные циклы: while и until

    Основная форма команды while имеет вид:

    while   список команд
    do
    список команд
    done

    Сначала выполняются команды из первого списка, и если код за-
    вершения последней команды в этом списке равен 0,  тогда выполня-
    ются команды из второго списка. Эта последовательность повторяет-
    ся до тех пор,  пока код завершения первого списка равен 0. Чтобы
    цикл выполнялся до тех пор, пока код завершения первого списка не
    равен 0, надо заменить while на until.
    Любая строка может быть заменена символом «точка с  запятой».
    Код завершения команд while и until равен коду завершения послед-
    ней выполненной команды во втором списке. Если команды из второго
    списка не выполнялись, код завершения равен 0.

    7-31

    Организация цикла для списка: for

    Часто бывает нужно выполнить  некоторый  набор  операций  для
    каждого файла   из  какого-либо списка или выполнить одну команду
    для каждого из нескольких аргументов. Для этого существует коман-
    да for. Формат команды for следующий:

    for переменная in список значений
    do
    список команд
    done

    Значения переменных в списке разделяются пробелами. Команды в
    списке команд  выполняются один раз для каждого значения перемен-
    ной из списка значений.  Переменной по очереди присваивается каж-
    дое значение из списка.  Например,  следующий цикл for производит
    сравнение исходных текстов xec.c,  cmd.c и word.c в текущем ката-
    логе с     файлами   с   такими   же   именами,   но  в  каталоге
    /usr/src/cmd/sh:

    for CFILE in xec cmd word
    do    diff $CFILE.c /usr/src/cmd/sh/$CFILE.c
    done

    Обратите внимание на то,  что первое упоминание  имени  CFILE
    сразу после  слова  for не сопровождается появлением символа «$»,
    поскольку в данном случае используется имя переменной,  но не  ее
    значение.
    Слово «in»,  являющееся частью команды for,  можно не  указы-
    вать. В    этом случае текущий набор позиционных параметров будет
    использован вместо списка значений. Это полезно в том случае, ес-
    ли набор команд выполняется для каждого аргумента из списка аргу-
    ментов, общее число которых неизвестно.
    В качестве примера создайте файл с именем echo2,  который со-
    держит следующий текст:

    for word
    do echo $word$word
    done

    Измените статус файла echo2:

    chmod +x echo2

    7-32

    Теперь введите следующую команду:

    echo2 ma pa bo fi yo no so ta

    Результатом выполнения этой команды будет:

    ———————————————————

    ¦   mama
    ¦   papa
    ¦   bobo
    ¦   fifi
    ¦   yoyo
    ¦   nono
    ¦   soso
    ¦   tata
    ¦

    Управление циклами: break и continue

    Для прекращения  выполнения  циклов while или for применяется
    команда break.  Команда continue немедленно запускает  выполнение
    следующего шага   в цикле.  Эти команды действуют только если они
    встречаются между командами do и done.
    Команда break завершает выполнение только выполняемого в дан-
    ный момент цикла, вызывая продолжение работы команд, стоящих пос-
    ле ближайшего done. Выход из n-уровневого вложенного цикла дости-
    гается командой break n.

    7-33

    Команда continue продолжает выполнение с ближайшего открытого
    оператора for,  while или until, т.е. того, который содержит этот
    оператор continue.    Вы также можете задать аргумент n в команде
    continue, и тогда выполнение будет продолжено с n-ного вложенного
    цикла:

    # Эта процедура интерактивная.
    # Команды «break» и «continue» используются
    # пользователем для управления вводом данных.
    while true #loop forever
    do  echo «Please enter data»
    read response
    case «$response» in
    «done»)     break
    # no more data
    ;;
    «»)   # just a carriage return,
    # keep on going
    continue
    ;;
    *)    # process the data here
    ;;
    esac
    done

    Конец файла и выход

    Когда Shell обнаруживает конец файла в процедуре,  она завер-
    шается, возвращая в свой родительский процесс код завершения пос-
    ледней команды,  выполненной до обнаружения конца файла. Выход из
    Shell самого высокого уровня производится нажатием клавиши Ctrl-d
    (при этом пользователь выгружается из системы).
    Команда exit моделирует конец файла,  устанавливая код завер-
    шения равным значению своего аргумента,  если он  имеется.   Так,
    процедуру можно  нормально завершить,  указав в конце файла «exit
    0».

    Группирование команд: скобки () и []

    В интерпретаторе Shell имеется два способа группирования  ко-
    манд —  с помощью обычных и прямоугольных скобок.  Обычные скобки
    приказывают Shell создать подоболочку,  которая считывает  заклю-
    ченные в скобки команды. Правая и левая скобки распознаются в лю-

    7-34

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

    garble(stuff)

    то Shell выдаст сообщение об ошибке. Строки с кавычками типа:

    garble»(«stuff»)»
    «garble(stuff)»

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

    CURRENTDIR=`pwd`; cd /usr/docs/otherdir;
    nohup nroff doc.n > doc.out&; cd $CURRENTDIR

    и

    (cd /usr/docs/otherdir; nohup nroff doc.n > doc.out&)

    дают один и тот же результат: файл /usr/docs/otherdir/doc.n обра-
    батывается nroff     и     вывод     сохраняется     в      файле
    /usr/docs/otherdir/doc.out. (Следует заметить,  что команда nroff
    обрабатывает текстовую информацию.)  Во втором примере возврат  в
    начальный рабочий  каталог  происходит  автоматически.  Пробелы и
    символы новой строки вокруг скобок допустимы,  но не обязательны.
    При вводе  командной  строки  с  терминала  Shell высветит символ
    приглашения в виде значения переменной PS2, в случае, если требу-
    ется закрытие скобок.
    Фигурные скобки { и } могут также применяться для группирова-
    ния команд. Обе эти скобки распознаются только если они находятся
    на месте первого (не заключенного в кавычки) слова команды. После
    открывающей фигурной скобки может следовать символ новой строки —
    в этом случае Shell выдаст приглашение для  ввода  дополнительной
    информации. В  отличие от обычных скобок,  для фигурных скобок не
    создается никаких подоболочек — заключенные в них команды  просто
    считываются интерпретатором Shell.  Фигурные скобки удобны в слу-
    чае, когда  вы хотите использовать (последовательный)   вывод  от
    нескольких команд в качестве ввода для одной команды.

    7-35

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

    Определение функций

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

    name ( ) { список; }

    Список может  включать  в себя любую команду из ранее описан-
    ных. Функции  могут быть определены в одной части процедуры Shell
    и могут затем вызываться любое необходимое число раз. Ниже приво-
    дится пример функции с именем «getyn»:

    # Ответ «да» или отсутствие ответа — возвращение ненулево-
    # го значения  в случае «нет»
    getyn  ( )  {
    while echo «$* (y/n)? C» >& 2
    do   read yn rest
    case $yn in
    [yY] return 0                        ;;
    [nN] return 1                        ;;
    *)   echo «Please answer y or n» >&2 ;;
    esac
    done
    }

    В этом  примере функция добавляет «(y/n)?» к выводу и ожидает
    ввода символов «Y»,  ‘y»,  «N» или «n»,  возвращая 0 или 1.  Если
    введены какие-либо   другие символы,  функция просит пользователя
    исправить ввод.
    Функции можно использовать так же как и любые другие команды.
    Вызов функции getyn может быть, например, такой:

    getyn «Do you wish to continue» || exit

    Надо помнить,  что при этом позиционные  параметры  $1,$2,…
    устанавливаются равными значениям аргументов функции. Т.к. коман-
    да exit, использованная в функции, завершает работу всей процеду-
    ры, то    для возвращения обратно в процедуру требуется применять
    команду return.

    7-36

    Переопределение направления ввода/вывода и управляющие коман-
    ды

    Обычно Shell не разветвляет свои процессы и не создает  новые
    подоболочки при обнаружении управляющих команд (отличных от обыч-
    ных скобок).  Однако,  каждая команда в конвейере выполняется как
    отдельный процесс для того,  чтобы правильно направить ввод и вы-
    вод для каждой команды.  Когда  переадресация  ввода-вывода  явно
    указана в  команде,  тогда запускается отдельный процесс для этой
    команды. Таким  образом,  когда команды if,  while, until, case и
    for применяются в конвейере,  состоящем более чем из одной коман-
    ды, Shell  разветвляется и подоболочка выполняет управляющую  ко-
    манду. При этом надо помнить:
    1. Все изменения, сделанные с переменными во время выполнения
    управляющей команды, не сохраняются при ее завершении. Это
    аналогично группированию команд с помощью обычных скобок.
    2. Управляющие  команды при переадресации выполняются немного
    медленнее.

    Обмен между файлами: команда (.)

    Командная строка в виде :

    . proc

    указывает Shell считать команды из proc,  не создавая нового про-
    цесса. Изменения,   сделанные  с переменными в proc,  сохраняются
    после завершения команды (.).  Это удобный  способ  инициализации
    сразу нескольких переменных Shell.  Обычно эту команду используют
    для реинициализации интерпретатора Shell верхнего уровня  чтением
    файла .profile:

    . .profile

    Управление прерываниями: trap

    Процедуры Shell  могут использовать команду trap для отключе-
    ния сигнала (когда это требуется)  или  для  переопределения  его
    действия. Синтаксис команды trap следующий:

    trap аргумент список_сигналов

    7-37

    Здесь аргумент — это текст, который интерпретируется как спи-
    сок команд, а список_сигналов состоит из одного или более номеров
    сигналов, описанных  в UNIX Programmer’s Reference. Наиболее важ-
    ными сигналами являются:

    ————T———————————————-
    ¦  номер   ¦     сигнал                                   ¦
    +———-+———————————————-+
    ¦    0     ¦  Выход из Shell                              ¦
    ¦    1     ¦  HANGUP                                      ¦
    ¦    2     ¦  символ INTERRUPT (DELETE или RUB OUT)       ¦
    ¦    3     ¦  QUIT (Ctrl-\)                               ¦
    ¦    9     ¦  KILL (не может быть перехвачен или          ¦
    ¦          ¦   проигнорирован)                            ¦
    ¦   11     ¦  Изменение сегментации (не может быть пере-  ¦
    ¦          ¦   хвачен или проигнорирован)                 ¦
    ¦   15     ¦  Сигнал завершения работы программы          ¦
    L———-+————————————————

    Команды, указанные  в  аргументе,  просматриваются по меньшей
    мере один раз, когда Shell встречает команду trap. Из-за этого мы
    советуем вам заключать эти команды в одинарные,  а не двойные ка-
    вычки, т.к.  первые вызывают немедленную подстановку команд и пе-
    ременных. Это  становится важным, когда вы, например, хотите уда-
    лить временные файлы и имена этих файлов еще  не  определены  при
    первом чтении  команды trap интерпретатором.  Следующая процедура
    напечатает в качестве информации для  пользователя  имя  текущего
    каталога, в котором выполнялось задание, когда было получено пре-
    рывание:

    trap ‘echo Directory was `pwd` when interrupted` 2 3 15
    for i in /bin /usr/bin /usr/gas/bin
    do
    cd $i
    # здесь идут команды, исполняемые в каталоге $i
    done

    Та же самая процедура, но с двойными кавычками выполняет дру-
    гие действия. Следующая команда:

    trap «echo Directory was `pwd` when interrupted» 2 3 15

    печатает имя каталога, из которого впервые стала выполняться про-
    цедура.
    Сигнал с номером 11 никогда не может быть перехвачен, т.к. он
    необходим самому интерпретатору для правильного распределения па-
    мяти. Ноль интерпретируется командой trap как сигнал, образующий-
    ся при выходе из Shell. Это происходит любо при выполнении коман-
    ды exit,  либо при достижении конца процедуры.  Если аргумент  не
    указан, тогда при получении любого из сигналов выполняются приня-
    тые в системе по умолчанию действия.  Если аргумент является пус-
    тым («»   или »),  тогда сигналы из списка сигналов игнорируются
    Shell’ом.

    7-38

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

    temp=$HOME/temp/$$
    trap ‘rm -f $temp; exit’ 0 1 2 3 15
    ls > $temp
    # здесь идут команды, использующие $temp

    В этом примере,  как только любой из сигналов 1,  2, 3 или 15
    будет получен процедурой или сама процедура будет завершаться, то
    будут выполнены все команды, записанные в одинарных кавычках. Ко-
    манда exit здесь необходима,  т.к. в противном случае Shell будет
    читать команды дальше после того места, где был получен сигнал.
    В некоторых  случаях Shell продолжает чтение команд после вы-
    полнения команды trap.  Приводимая ниже  процедура  берет  каждый
    подкаталог из текущего каталога, переходит туда, печатает его имя
    и выполняет команды, вводимые с терминала до тех пор, пока не бу-
    дет введен символ конца файла (Ctrl-d) или не будет получено пре-
    рывание. Конец файла вызывает возврат из команды read с ненулевым
    кодом завершения,  тем самым прекращая цикл while и запуская цикл
    для следующего имени каталога.  Прерывания игнорируются во  время
    выполнения вводимых команд, но вызывают завершение, если процеду-
    ра в этот момент ждет ввода:

    d=`pwd`
    for i in *
    do  if test -d $d/$i
    then cd $d/$i
    while echo «$i:»
    trap exit 2
    read x
    do    trap : 2
    # игнорирование прерываний
    eval $x
    done
    fi
    done

    Одновременно может быть указано несколько команд trap.   Если
    различные сигналы   получены одновременно,  они обрабатываются по
    очереди в возрастающем порядке.  Чтобы определить, перехват каких
    прерываний установлен в данный момент, введите:

    trap

    Важно понимать определенные моменты в том,  как Shell обраба-
    тывает команду trap.  Когда Shell получает  сигнал  (отличный  от
    11), он передается во все дочерние процессы, выполняющиеся в дан-

    7-39

    ный момент. Когда эти (синхронные) процессы завершатся, нормально
    или ненормально,  Shell просматривает все установленные перехваты
    и выполняет соответствующую команду trap. Этот процесс идет свер-
    ху вниз,  за исключением перехватов,  установленных во время заг-
    рузки. В этом случае возможно, что нет никаких дочерних процессов
    и Shell   перед тем,  как просматривать установленные прерывания,
    ждет завершения первого процесса,   запущенного  после  получения
    сигнала.
    Когда сигнал переопределяется в процедуре Shell, это не пере-
    определяет сигналов для программ, вызванных из этой процедуры.
    Для внутренних команд Shell  обычно  обрабатывает  прерывания
    после завершения команды. Исключение из этого правила сделано для
    команды read,  чьи прерывания обрабатываются немедленно,  так что
    команда read может быть прервана во время ожидания ввода.

    Пример работы интерпретатора Shell

    Ниже приводится  фрагмент программы Shell,  связанный с обра-
    боткой сигналов.

    :
    #
    #     Установка подпрограмм обработки сигналов
    #
    trap «echo
    trap «echo
    trap «echo
    #
    #     Замечание: Если вы перешли в другой каталог, вы можете
    #     сбросить прерывание SIGQUIT с обнаружением файла «core».
    #     Для этого вставьте соответствующую строку после команды
    #     cd.
    #
    trap «echo

    echo » Going into loop0
    while true
    do
    cd /tmp
    trap «echo
    lf
    cd /usr
    trap «echo
    lf
    sleep 1
    done
    echo » Leaving the loop 0
    exit 0

    7-40

    Специальные команды Shell
    ————————————————————-

    Существует несколько специальных команд,  являющихся внутрен-
    ними для Shell.  Некоторые из них мы уже рассмотрели. Интерпрета-
    тору не требуется создавать подоболочку для выполнения  этих  ко-
    манд и   следовательно не создаются дополнительные процессы.  Эти
    команды рекомендуем использовать везде,  где это возможно,   т.к.
    они работают быстрее и эффективнее, чем другие команды UNIX.
    Некоторые из специальных команд мы уже рассмотрели,  т.к. они
    влияют на управление процессами.  Это точка (.), break, continue,
    exit и trap.  Команда set также  является  специальной  командой.
    Описание остальных специальных команд приводится ниже:

    :                Пустая команда. Она не делает ничего и может
    использоваться для  вставки  комментариев  в
    процедуры. Ее код завершения равен 0 (true).
    Все аргументы,  передаваемые команде :, про-
    веряются на синтаксические ошибки.  Если вы-
    дается сообщение об ошибке,   заключите  эти
    аргументы в кавычки.  Подстановка параметров
    выполняется как и для любых других команд.

    cd arg           Делает arg текущим каталогом.  Если  arg  не
    является каталогом  или  у  пользователя нет
    права доступа к нему,  команда завершается с
    ненулевым кодом завершения.  Указание cd без
    аргументов эквивалентно  вводу  «cd  $HOME»,
    что возвращает вас в каталог загрузки.

    exec arg …     Если arg является командой,  то Shell выпол-
    няет ее,  не создавая подоболочки. В команд-
    ной строке допускаются аргументы переадреса-
    ции ввода-вывода.  Если указаны только аргу-
    менты, перенаправляющие    ввод-вывод,    то
    изменяются только ввод-вывод самого  интерп-
    ретатора Shell.

    7-41

    hash [-r] name   Этой командой запоминается место в пути  по-
    иска команды,   указанной  в name.  Опция -r
    указывает Shell,  что старые значения  можно
    стереть. Если никаких аргументов не указыва-
    ется, то выводится информация о  запомненных
    командах. Hits — это количество раз, которое
    команда вызывалась Shell.  Cost —  это  мера
    затрат, необходимых  для нахождения команды.
    Бывают ситуации,  требующие пересчета  места
    расположения команды.

    newgrp arg…    Команда newgrp при выполнении  создает новый
    интерпретатор Shell,  который заменяет  ста-
    рый. Помните,  что в новом Shell будут опре-
    делены только переменные системы.  Все пере-
    менные, которые  раньше  были  помечены  как
    экспортируемые, теперь станут обыкновенными.

    pwd              Печатает текущий каталог.

    read var…      Из стандартного ввода считывается одна стро-
    ка и  первое слово интерпретируется как зна-
    чение первой переменной, второе — как значе-
    ние второй,  и т.п. Все оставшиеся считанные
    слова присваиваются  последней   переменной.
    Код завершения равен нулю,  если не был счи-
    тан символ конца файла.

    readonly var… Указанные переменные помечаются  как  пригод-
    ные только для чтения, так что никаких после-
    дующих переприсвоений им сделать нельзя. Если
    никаких аргументов  не указано,  то выводится
    список всех помеченных таким образом перемен-
    ных и переменных, которые экспортируются.

    return n        Вызывает  возврат из функции с кодом заверше-
    ния, равным n.  Если n не указано, то код за-
    вершения равен  коду завершения последней вы-
    полненной команды.

    7-42

    times           Печатает  суммарное  время,    использованное
    пользователем и процессами,   запущенными  из
    текущей оболочки.

    type  name      Для каждого указанного имени показывает,  как
    оно будет интерпретироваться в случае,   если
    будет использоваться в качестве имени команды.

    ulimit [ -f] n  Эта команда устанавливает предел размера  за-
    писываемого файла равным n блоков.   Флаг  -f
    устанавливает этот предел для файлов, записы-
    ваемых дочерними процессами (считываться  мо-
    гут файлы любого размера). Команда, указанная
    без аргумента, показывает текущий установлен-
    ный предел.

    umask nnn       Устанавливает маску для создания файлов поль-
    зователя равной nnn. Если nnn отсутствует, то
    печатается текущее значение маски.  Эта бито-
    вая маска  используется  для  установки  прав
    доступа к  файлам при их создании.  Например,
    значение маски,  равное  восьмеричному  числу
    137, соответствует  следующей битовой маске и
    правам доступа для создаваемого файла:
    ————T———-T——T——
    ¦           ¦пользоват.¦группа¦другие¦
    +————+———-+——+——+
    ¦восьмеричн.¦     1    ¦   3  ¦  7   ¦
    +————+———-+——+——+
    ¦бит. маска ¦   001    ¦  011 ¦ 111  ¦
    +————+———-+——+——+
    ¦доступ     ¦   rw-    ¦  r-  ¦ -—  ¦
    L————+———-+——+——-
    Допустимые значения nnn см.   в  UNIX  User’s
    Reference.

    unset name      Для каждого указанного имени удаляет соответ-
    ствующую переменную или функцию.   Переменные
    PATH, PS1, PS2, MAILCHECK и IFS удалить нель-
    зя.

    7-43

    wait n          Shell ждет завершения  всех активных дочерних
    процессов. Если n указано,  то Shell ждет за-
    вершения только указанного процесса.  Код за-
    вершения команды wait всегда равен 0, если не
    указан аргумент n,  в противном случае он ра-
    вен коду завершения дочернего процесса n.

    7-44

    Создание и организация процедур Shell
    ————————————————————-

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

    proc args

    а не

    sh proc args

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

    LETTER=$1
    shift
    for i in $*
    do mail $i < $LETTER
    done

    Затем введите:

    chmod +x mailall

    Созданную новую  команду  можно  теперь запускать из текущего
    каталога введя, например:

    mailall letter joe bob

    Здесь letter это имя файла, содержащего сообщение, которое вы
    хотите разослать, а joe и bob — это адресаты.
    Если mailall создан таким способом в каталоге,   указанном  в
    переменной PATH, то пользователь может менять каталоги и вызывать
    mailall таким же способом.

    7-45

    Процедуры Shell часто используются пользователями, работающи-
    ми в csh. Однако, если первым символом процедуры является # (сим-
    вол комментария),  то csh полагает, что данная процедура является
    процедурой csh и вызывает для ее выполнения /bin/csh.  Всегда на-
    чинайте процедуры Shell с какого-либо другого символа, если пред-
    полагается, что  ею будут пользоваться и пользователи, работающие
    в csh. В этом случае для ее выполнения будет вызываться стандарт-
    ный интерпретатор Shell /bin/sh.
    Процедуры Shell могут создаваться динамически.  Процедура мо-
    жет генерировать файл с командами,  вызывать другой интерпретатор
    для выполнения   этого файла и затем удалять его.  Альтернативный
    подход — это применение команды (.),  чтобы заставить текущий ин-
    терпретатор прочитать команды из нового файла,  использовать зна-
    чения существующих переменных Shell,  не создавая дополнительного
    процесса в подоболочке.
    Многие пользователи предпочитают писать процедуры Shell, а не
    программы на Си или другом традиционном языке программирования. У
    этого есть свои причины:
    1. Процедуру Shell легко создавать и работать с ней, т.к. это
    обычный текстовый файл.
    2. У  процедуры  Shell  нет соответствующего объектного кода,
    который требовалось бы создавать.
    3. Процедуру  Shell  можно быстро создать,  использовать нес-
    колько раз и удалить.
    4. Поскольку процедуры Shell короткие,  написаны на языке вы-
    сокого уровня и содержат только исходный текст,  их  очень
    легко понимать и при необходимости исправлять.

    По принятому  соглашению,  каталоги,  которые содержат только
    команды и процедуры Shell,  называются bin. Это имя является сок-
    ращением от  binary (двоичный)  и используется потому,  что часто
    скомпилированные и выполняемые программы называют binaries, чтобы
    отличать их от исходных текстов программ. Большинство групп поль-
    зователей имеют свои собственные bin-каталоги для хранения  общих
    процедур. Некоторые пользователи указывают в переменной PATH нес-
    колько таких каталогов.  Мы не советуем указывать много каталогов
    в переменной PATH,  т.к.  от этого может пострадать эффективность
    выполнения процедур.

    7-46

    Дополнительная информация о флагах
    ————————————————————-

    В Shell  имеется  несколько  флагов,  доступных для процедур.
    Это:

    -e   Этот флаг указывает Shell на необходимость  немедленного
    выхода, если  какая-либо выполняемая команда кончается с
    ненулевым кодом завершения. Этот флаг полезен для проце-
    дур, составленных из простых командных строк. Его нельзя
    использовать в сочетании с другими условными конструкци-
    ями.

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

    -t   Этот флаг  указывает  Shell’у  на  необходимость  выхода
    после считывания и выполнения команд,  оставшихся на те-
    кущей командной строке.  Этот флаг  обычно  используется
    программами на Си, которые вызывают Shell для выполнения
    отдельной команды.

    -n   Это флаг отмены выполнения.  Его используют, когда хотят
    проверить процедуру на наличие синтаксических ошибок, но
    при этом не выполнять саму процедуру.  Это делается ука-
    занием «set -nv» в начале файла.

    -k   Этот  флаг  указывает Shell’у,  что все аргументы в виде
    переменная=значение должны рассматриваться как  ключевые
    параметры. Когда этот флаг не установлен,  ключевыми па-
    раметрами считаются только аргументы,  стоящие перед са-
    мой командой.

    7-47

    Команды поддержки и их особенности
    ————————————————————-

    Процедуры Shell могут использовать любую команду UNIX. Коман-
    ды, описываемые  в этой главе, либо особенно часто используются в
    процедурах, либо специально разработаны для такого использования.

    Условная проверка: test

    Команда test проверяет выражение,  указанное в качестве аргу-
    мента, и  если выражение истинно, то test заканчивается с нулевым
    кодом. В  противном случае возвращается ненулевой код завершения.
    test также дает ненулевой код завершения в случае, если не указа-
    ны аргументы.  Часто бывает удобно применять test в качестве пер-
    вой команды в списке команд после if или while. Переменные Shell,
    используемые в проверяемых выражениях,  должны быть  заключены  в
    двойные кавычки,  если имеется вероятность, что они пустые или не
    определены.
    В качестве  альтернативного  обозначения  команды  test можно
    применять квадратные скобки, например:

    [ выражение ]

    имеет такое же действие как:

    test выражение

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

    -r file    Истинно, если указанный файл существует и доступен
    пользователю для чтения.

    -w file    Истинно, если указанный файл существует и доступен
    пользователю для записи.

    -x file    Истинно,   если  указанный файл существует и может
    быть выполнен пользователем.

    -s file    Истинно,  если  указанный  файл существует и имеет
    ненулевую длину.

    7-48

    -d file    Истинно, если указанный файл является каталогом.

    -f file    Истинно, если указанный файл является обычным фай-
    лом.

    -z sl      Истинно, если длина строки sl равна нулю.

    -n sl      Истинно, если длина строки sl не равна нулю.

    -t fildes  Истинно, если открытый файл с дескриптором fildes
    соответствует терминалу. Если fildes не указан, по
    умолчанию считается fildes=1.

    s1 = s2    Истинно, если строки s1 и s2 идентичны.

    s1 != s2   Истинно, если строки s1 и s2 различны.

    s1         Истинно, если строка s1 ненулевая.

    n1 -eq n2  Истинно, если  целые  числа  n1 и n2 алгебраически
    равны. Другие алгебраические сравнения обозначают-
    ся: -ne (не равно),  -gt (больше чем), -ge (больше
    или равно), -lt (меньше чем), -le (меньше или рав-
    но).

    Все эти опции можно объединять со следующими операторами:

    !          оператор унарного отрицания
    -а         бинарный логический оператор AND (и)
    -o         бинарный логический оператор OR (или), имеет мень-
    ший приоритет, чем AND
    (выраж)    Скобки  для группирования.  При  отсутствии скобок
    проверка выражения идет слева направо.

    Помните, что все опции,  операторы, имена файлов и т.д. явля-
    ются отдельными аргументами для test.

    7-49

    Команда echo

    Команда echo имеет следующий синтаксис:

    echo [опции] [аргументы]

    echo копирует свои аргументы в стандартный вывод,  после каж-
    дого кроме последнего аргумента добавляется пробел. После послед-
    него выведенного аргумента обычно ставится символ  новой  строки.
    Вы можете   использовать  эту  команду для выдачи приглашения для
    ввода, организации  вывода сообщений в процедурах Shell  или  для
    добавления нескольких  строк в выходной поток в середине конвейе-
    ра. Другое  применение echo —  это  проверка  процесса  генерации
    списка аргументов для других команд.
    Вы можете вместо команды ls использовать:

    echo *

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

    echo -n ‘enter name:’
    read name

    Команда echo  может обрабатывать некоторые ESC-последователь-
    ности, описанные в UNIX User’s Reference.

    Оценка арифметических выражений: expr

    Команда expr осуществляет арифметические и  логические  дейс-
    твия над  целыми числами и в качестве ее аргументов можно исполь-
    зовать шаблоны.  Эта  команда  оценивает  отдельное  выражение  и
    записывает результат в стандартный вывод. expr можно использовать
    внутри обратных кавычек для установки значения переменных.   Ниже
    приводятся характерные примеры использования этой команды:

    #  увеличить $A
    A=`expr $A + 1`
    #  поместить символы $1 с 3-го по последний
    #  в подстроку substring
    substring=`expr «$1» : ‘..\(.*\)’`
    #  получить длину $1
    c=`expr «$1» : ‘.*’`

    7-50

    Наиболее часто expr применяется для подсчета числа итераций в
    циклах.

    Команды true и false

    Команды true  и  false  возвращают код завершения 0 или не 0,
    соответственно. Их часто используют для создания безусловных цик-
    лов, например:

    while true
    do echo forever
    done

    В результате  слово forever будет появляться на экране до тех
    пор, пока не будет нажато INTERRUPT.

    Внутристрочный ввод документов

    При обнаружении командной строки в виде:

    command << eofstring

    где eofstring — любая произвольная строка,  Shell будет восприни-
    мать все  последующие  строки  как  стандартный  ввод для команды
    (command) до тех пор,  пока не будет прочитана строка, содержащая
    только eofstring.  (При добавление знака (-) к символам переадре-
    сации (<<)  из каждой строки вводимого документа будут  удаляться
    лишние пробелы и знаки табуляции.)
    Shell создает временный файл, содержащий вводимый документ, и
    производит в   нем  необходимые подстановки команд и переменных и
    затем только пересылает его в указанную команду.  При подстановке
    команд в   командной строке выполняется поиск файлов по указанным
    шаблонам. Для того, чтобы отменить все подстановки, введите:

    command <<\eofstring

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

    7-51

    cat <<-xx
    Это сообщение будет выведено на терми-
    нал без лишних пробелов и знаков табу-
    ляции.
    xx

    Переадресация ввода-вывода с помощью дескрипторов файлов

    Мы ранее уже говорили, что команда обычно направляет свой вы-
    вод в некоторый файл с дескриптором, равным 1 или 2. В языках ти-
    па Си можно связать вывод с любым дескриптором  файла  с  помощью
    системной команды write (см. UNIX User’s Reference). В Shell име-
    ется свой собственный механизм создания выходного файла,  связан-
    ного с конкретным дескриптором файла. Вводя :

    fd1 >& fd2

    где fd1  и fd2 — разрешенные дескрипторы файлов,  можно направить
    вывод, который был связан с файлом с дескриптором fd1  в  файл  с
    дескриптором fd2. По умолчанию значения fd1 и fd2 равны 1. Если к
    моменту выполнения команды значение fd2 не определено, то переад-
    ресация отменяется. Наиболее часто этот механизм используется для
    переадресации стандартного вывода ошибок в файл стандартного  вы-
    вода. Это делается так:

    command 2>&1

    Если вы хотите перенаправить и стандартный вывод и вывод оши-
    бок в один и тот же файл file, введите:

    command 1>file 2>&1

    Порядок следования аргументов здесь важен: сначала дескриптор
    1 связывается с файлом file, затем дескриптор 2 связывается с тем
    же файлом,  т.к. он уже связан с дескриптором 1. Если порядок ар-
    гументов изменить,   то вывод ошибок пойдет на терминал,  а стан-
    дартный вывод пойдет в file,  т.к. к моменту переадресации вывода
    ошибок дескриптор 1 будет связан с терминалом.

    7-52

    Этот механизм может быть обобщен для переадресации  стандарт-
    ного ввода. Если вы введете, например:

    fda <& fdb

    то оба дескриптора fda и fdb будут связаны с одним и тем же вход-
    ным файлом. Если fda и fdb не указаны, то они принимаются равными
    0. Такая переадресация ввода удобна для команд, которые использу-
    ют несколько источников ввода.

    Подстановка по условию

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

    A=
    bcd=»»
    efg=»
    set »  «»

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

    ${variable:-string}    Если variable установлена и ненулевая,
    то вместо этого выражения подставляет-
    ся значение переменной  $variable.   В
    противном случае  выражение заменяется
    значением string.  Помните, что значе-
    ние variable при этом не изменяется.

    ${variable:=string}    Если variable установлена и ненулевая,
    то вместо этого выражения подставляет-
    ся значение  переменной  $variable.  В
    противном случае  переменная  variable
    устанавливаетcя равной  string и затем
    производится подстановка вместо  выра-

    7-53

    жения нового значения variable.  Пози-
    ционные параметры   установить   таким
    способом нельзя.

    ${variable:?string}    Если variable установлена и ненулевая,
    то вместо этого выражения подставляет-
    ся значение  переменной  $variable.  В
    противном случае печатается  сообщение
    в виде:

    variable: string

    и происходит  выход из текущей оболоч-
    ки. Если  вы  находитесь  в   основном
    Shell’е, то выхода не происходит. Если
    string не указана,  то сообщение будет
    выглядеть так:

    variable: parameter null or not set

    ${variable:+string}    Если variable установлена и ненулевая,
    то вместо этого выражения подставляет-
    ся значение string. В противном случае
    выражение заменяется нулевой  строкой.
    Помните, что   значение  variable  при
    этом не изменяется.

    Эти выражения можно также использовать без двоеточия.  В этом
    случае Shell только проверяет, была ли установлена переменная или
    нет.
    Следующие два  примера  показывают,   как  пользоваться этими
    средствами:

    1. Пример явного присвоения значения переменной PATH:

    PATH=${PATH:-‘:/bin:/usr/bin’}

    Это означает,  что если переменная PATH была установлена и
    ненулевая, то сохраняется ее текущее значение, в противном
    случае она устанавливается равной «:/bin:/usr/bin».

    2. Пример автоматического присвоения значения переменной HOME:

    cd ${HOME:=’/usr/gas’}

    Если HOME установлена и ненулевая, то происходит переход в
    этот каталог.   В противном случае HOME присваивается ука-
    занное значение и затем выполняется команда.

    7-54

    Флаги, устанавливаемые при вызове Shell

    При вызове  Shell  в командной строке можно указать пять фла-
    гов. Эти флаги нельзя включить командой set.

    -i    Если указан этот флаг, или ввод и вывод Shell оба  под-
    ключены к терминалу, то Shell является интерактивным. В
    таком Shell’е INTERRUPT (сигнал 2)   перехватывается  и
    игнорируется, а TERMINATE (сигнал 15) и QUIT (сигнал 3)
    игнорируются.

    -s    Если указан этот флаг или нет никаких аргументов  пере-
    адресации ввода-вывода,   то Shell считывает команды из
    стандартного ввода.  Вывод Shell записывается в файл  с
    дескриптором 2.  Все остальные аргументы обозначают по-
    зиционные параметры.

    -c    Когда указан этот флаг, Shell считывает команды из пер-
    вой строки,  следующей после флага. Все остальные аргу-
    менты игнорируются.

    -t    Когда указан этот флаг,  то считывается  и  выполняется
    только одна  команда и затем происходит выход из Shell.
    Этот флаг рекомендуется использовать с Си-программами.

    -r    Если указан этот флаг, то Shell является усеченной вер-
    сией Shell (см. rsh(C)).

    7-55

    Правила программирования в Shell
    ————————————————————-

    В этом разделе  приводятся  стратегии  написания  эффективных
    процедур Shell,   которые не тратят лишние ресурсы при выполнении
    поставленных задач. Основной задачей является достижение желаемо-
    го результата с минимальными затратами. Акцент всегда должен ста-
    виться на простоту,  ясность и удобочитаемость,  но эффективность
    может быть   достигнута  при использовании определенных стратегий
    программирования. Во многих случаях переорганизация процедуры по-
    вышает ее  эффективность за счет уменьшения размера,  и часто об-
    легчает ее понимание. В любом случае, вы можете не оптимизировать
    процедуры Shell,  пока они вас устраивают по быстродействию и ре-
    сурсов системы хватает для ее выполнения.
    Создание процедуры Shell состоит из таких же шагов, как и на-
    писание обычных программ:  написания текста, определения его раз-
    мера и  оптимизации только отдельных важных частей.  Пользователь
    должен уметь свободно пользоваться командой time,  которую  можно
    использовать для определения времени выполнения как всей процеду-
    ры, так и ее частей. Мы настоятельно рекомендуем пользоваться ей,
    т.к. человеческая интуиция непригодна для оценки времени выполне-
    ния программ.  Каждый тест должен быть  выполнен  несколько  раз,
    т.к. его    результаты  могут зависеть от загруженности системы в
    данный момент.

    Число генерируемых процессов

    Когда выполняется большое число коротких команд,  то действи-
    тельное время выполнения может быть значительно увеличено за счет
    создания вспомогательных процессов. Процедурами, для которых тре-
    буются значительные количества таких процессов, как правило явля-
    ются процедуры,  в которых выполняется много циклов и которые ге-
    нерируют командные последовательности, которые должны интерпрети-
    роваться другим Shell.
    Если вас беспокоит эффективность выполнения,  вам надо знать,
    какие команды являются встроенными в Shell,  а какие  нет.   Ниже
    приводится список всех встроенных команд:

    7-56

    break  case   cd         continue   echo
    eval   exec   exit       export     for
    if     read   readonly   return     set
    shift  test   times      trap       umask
    until  wait   while      .          :
    {}

    Обычные скобки ()  также являются встроенной командой, но ко-
    манда, заключенная  в них, выполняется как дочерний процесс, т.е.
    Shell разветвляется.  Все остальные команды, не указанные в спис-
    ке, являются внешними (требуют fork и exec).
    Пользователь должен всегда хотя бы приблизительно знать число
    процессов, генерируемых  процедурой.  Для всех приведенных  ранее
    процедур число генерируемых (не обязательно одновременно) процес-
    сов может быть оценено по формуле:

    число процессов = (k*n) + c

    где k и с — это константы,  а n может быть количеством аргументов
    процедуры, количеством строк во входном файле, количеством файлов
    в каталоге и т.п.  Повышение эффективности обычно достигается  за
    счет уменьшения константы k.

    7-57

    В качестве примера проанализируем процедуру с  именем  split,
    чей текст проведен ниже:

    :
    #     split
    trap ‘rm temp$$; trap 0; exit’ 0 1 2 3 15
    start1=0 start2=0
    b='[A-Za-z]’
    cat > temp$$
    #  read stdin into temp file
    #  save original lengths of $1,$2
    if test -s «$1»
    then start1=`wc -l < $1`
    fi
    if test -s «$2»
    then start2=`wc -l < $2`
    fi
    grep «$b» temp$$ >> $1
    #  lines with letters onto $1
    grep -v «$b» temp$$ | grep ‘[0-9]’ >> $2
    #  lines without letters onto $2
    total=» `wc -l< temp$$` »
    end1=» `wc -l< $1` »
    end2=» `wc -l< $2` »
    lost=» `expr $total — \($end1 — $start1\)\
    — \($end2 — $start2\)` »
    echo «$total read, $lost thrown away»

    Для каждой итерации в цикле имеется одна команда expr и  либо
    команда echo или другая команда expr. Еще одна дополнительная ко-
    манда echo выполняется в конце процедуры. Если n — число строк на
    вводе, то количество процессов равно 2*n+1.
    Некоторые разновидности  процедур  не   следует   писать   на
    Shell’е. Так,  например, если с каждым символом файла связан один
    или несколько процессов, хорошим решением будет перенос процедуры
    на язык  Си.   Shell-процедуры не следует использовать для посим-
    вольного сканирования или посимвольного формирования файлов.

    Количество байтов данных

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

    7-58

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

    sort file | grep pattern
    grep pattern file | sort

    Поиск в каталогах

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

    ls -l /usr/bin* >/dev/null
    cd /usr/bin; ls -l * >/dev/null

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

    Порядок поиска в каталогах и переменная PATH

    Переменная PATH  предоставляет удобный механизм для организа-
    ции процедур. Однако применять ее нужно с разумной осторожностью,
    иначе может произойти значительное увеличение дополнительных зат-
    рат системных ресурсов.
    Процесс нахождения  команды  заключается в чтении содержимого
    каждого каталога,  включенной в переменную PATH,  до тех пор пока
    не будет  найдена нужная команда.  В качестве примера рассмотрим,
    как вызывается nroff (предположим,  что команда находится в ката-
    логе /usr/bin), когда переменной PATH присвоено значение «:/bin:/
    usr/bin». Последовательность просмотра каталогов следующая:

    .
    /
    /bin
    /
    /usr
    /usr/bin

    В нашем  примере было просмотрено 6 каталогов.  Если же пере-
    менной PATH присвоен длинный список путей, то количество просмат-
    риваемых каталогов может значительно возрасти.

    7-59

    Бездумное присвоение  переменной  PATH  значений  приводит  к
    большим затратам   времени  на ненужный просмотр каталогов.  Ниже
    приводятся четыре примера значений переменной PATH в  порядке  от
    самого плохого варианта до наилучшего:

    :/usr/john/bin:/usr/localbin:/bin:/usr/bin
    :/bin:/usr/john/bin:/usr/localbin:/usr/bin
    :/bin:/usr/bin:/usr/john/bin:/usr/localbin
    /bin::/usr/bin:/usr/john/bin:/usr/localbin

    Первый вариант следует исключить. Остальные варианты приемле-
    мы и выбор среди них определяется составом команд, содержащихся в
    каталогах /bin и /usr/bin.
    Процедуру, которая вызывает много коротких команд, часто мож-
    но ускорить,  если внутри процедуры  установить  переменную  PATH
    так, чтобы   просматривалось только необходимое число каталогов в
    оптимальном порядке.

    Правила создания каталогов

    Мы советуем вам не создавать каталогов больше,  чем вам необ-
    ходимо. Вы    должны знать,  что существуют несколько специальных
    размеров каталогов. Каталог, содержащий до 30 файлов (считая фай-
    лы .  и ..), умещается на одном блоке диска и может быть просмот-
    рен очень быстро.  Каталог,  содержащий до 286 файлов,  еще можно
    считать маленьким,  использование каталога большего размера в ка-
    честве рабочего уже связано с определенными неудобствами.  Мы  не
    советуем делать рабочие каталоги больше, чем стандартные. Особен-
    но важно сохранять загрузочный каталог маленьким, желательно раз-
    мером в 1 блок. Помните, что каталоги, как правило, не ужимаются.
    Если ваш каталог содержит более 30 или 286 файлов, то поиск будет
    выполняться неэффективно.  Более того, даже если вы удалите файлы
    так, что  их у вас станет меньше, чем указанные пределы, операци-
    онная система все равно будет просматривать каталог неэффективно.

    7-60

    Примеры процедур Shell
    ————————————————————-

    Возможности командного языка Shell наиболее явно  чувствуются
    при виде того, как легко можно объединить много утилит для выпол-
    нения нужных команд.  В этом разделе приводятся примеры процедур.
    Изучая эти примеры, вы приобретете навыки программирования проце-
    дур Shell.  Обратите внимание на то, что все процедуры начинаются
    с команды (:), а символ # открывает строку комментариев.
    Для каждой процедуры надо выполнить следующие действия:
    1. Создайте файл с именем процедуры и запишите ее туда.
    2. Измените права доступа к файлу с помощью команды chmod.
    3. Переместите файл в каталог,  где хранятся команды,  напри-
    мер, в ваш bin.
    4. Убедитесь,  что в переменной PATH имеется имя вашего ката-
    лога bin.
    5. Выполните указанную команду.

    BINUNIQ

    :
    ls /bin /usr/bin | sort | uniq -d

    Эта процедура определяет,  какие файлы с одинаковыми  именами
    находятся в  каталогах  /bin и в /usr/bin.  Файлы в каталоге /bin
    в большинстве случаев заменяют собой одноименные файлы в каталоге
    /usr/bin.

    7-61

    COPYPAIRS

    :
    #   Формат: copypairs file1 file2 …
    #   Копирует file1 в file2, file3 в file4, …
    while test «$2» != «»
    do
    cp $1 $2
    shift; shift
    done
    if test «$1″ !=»»
    then echo «$0: odd number of arguments» >&2
    fi

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

    COPYTO

    :
    #   Формат:  copyto dir file …
    #   Копирует перечисленные файлы в каталог «dir»
    #   при условии, что указано не менее двух
    #   аргументов, что «dir» является каталогом,
    #   и что каждый последующий аргумент
    #   представляет собой файл, доступный для чтения.
    if test $# -lt 2
    then echo «$0: usage: copyto directory file …»>&2
    elif test ! -d $1
    then echo «$0: $1 is not a directory»;>&2
    else dir=$1; shift
    for eachfile
    do    cp $eachfile $dir
    done
    fi

    7-62

    Эта процедура  использует  команду  if для вывода сообщений о
    неправильном применении процедуры.  Цикл for  в  конце  процедуры
    просматривает все аргументы, кроме первого.

    DISTINCT1

    :
    #   Формат: distinct1
    #   Читает стандартный ввод и выводит список
    #   алфавитно-цифровых строк, различающихся только
    #   размером букв, представляя их в строчной форме
    tr -cs ‘A-Za-z0-9’ ‘\012’ | sort -u |\
    tr ‘A-Z’ ‘a-z’ | sort | uniq -d

    Эта процедура является примером процесса, создаваемого конве-
    йером. Символ  \ в конце первой строки означает,   что  следующая
    строка является продолжением. На первый взгляд представляется не-
    ясным, как эта команда работает.  С принципами работы команд  tr,
    sort и  uniq  можно  ознакомиться в User’s Reference.  Команда tr
    преобразует все символы,  кроме букв и цифр,   в  символы  «новая
    строка», после чего уплотняет повторяющиеся символы. В результате
    каждый набор литер окажется в отдельной строке. Команда sort сор-
    тирует строки  и  оставляет из любой последовательности повторяю-
    щихся строк только одну строку.  Следующая команда tr преобразует
    все буквы в строчные, делая тем самым идентификаторы, отличающие-
    ся лишь величиной букв, одинаковыми. Вывод вновь сортируется, все
    дубликаты собираются вместе. Команда «uniq -d» формирует перечень
    строк, встречающихся в тексте более одного раза.
    Процесс построения  подобного конвейера основан на том факте,
    что каналы и файлы могут взаимозаменяться.  Первая из  нижеприве-
    денных строк  эквивалентна  двум  последующим при условии наличия
    достаточного дискового пространства:

    cmd1 | cmd2 | cmd3
    cmd1 > temp1; < temp1 cmd2 > temp2; < temp2 cmd3
    rm temp[123]

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

    7-63

    DRAFT

    :
    #   Формат: draft file(s)
    #   Вывод страниц на принтер.
    for i in $*
    do nroff -man $i | lpr
    done

    Пример использования  явных  флагов,   не имеющих значений по
    умолчанию.

    EDFIND

    :
    #   Формат: edfind file arg
    #   Ищет последнее появление в файле «file» строки,
    #   начинающейся с подстроки «arg», после чего
    #   выводит 3 строки (предыдущую, найденную,
    #   последующую)
    ed — $1 << -EOF
    ?^$2?
    -,+p
    q
    EOF

    Иллюстрация использования команды ed для  редактирования  ис-
    ходных текстов,   в  которых Shell выполняет подстановку значений
    переменных.

    7-64

    EDLAST

    :
    #   Формат: edlast file
    #   Выводит последнюю строку файла
    #   и удаляет ее.
    ed — $1 << -\!
    $p
    $d
    w
    q
    !
    echo done

    Иллюстрация считывания  данных  из  файла до восклицательного
    знака.

    FSPLIT

    :
    #    Формат: fsplit file1 file2
    #    Чтение стандартного ввода и разбиение его на 3 части
    #    с добавлением строки, содержащей не менее одной буквы,
    #    к файлу file1, добавления другой строки с цифрами, но
    #    без букв к файлу file2, и сбрасыванием остального.
    count=0 gone=0
    while read next
    do
    count=»`expr $count +1`»
    case «$next» in
    *[A-Za-z]*)
    echo «$next» >> $1 ;;
    *[0-9]*)
    echo «$next» >> $2 ;;
    *)
    gone=»`expr $gone + 1`»
    esac
    done
    echo  «$count lines read, $gone thrown away»

    На каждой итерации цикла из вводного потока считывается стро-
    ка и анализируется.  Цикл завершается только тогда, когда команда
    read обнаружит  конец  файла.  Обратите внимание на использование
    команды expr.

    7-65

    LISTFIELDS

    :
    grep $* | tr «:» «\012»

    Эта процедура выводит в виде строк свой аргумент. Она заменя-
    ет каждый символ «:» на символ новой строки. Так, если в качестве
    аргумента указать:

    joe newman: 13509 NE 78th St: Redmond, Wa98062

    то эта процедура выведет:

    joe newman
    13509 NE 78th St
    Redmond, Wa98062

    MKFILES

    :
    #    Формат: mkfiles pref [quantity]
    #    Создает файлы «quantity».
    #    По умолчанию — 5, как показано на следующей строке.
    quantity=${2-5}
    i=1
    while test «$i» -le «quantity»
    do
    > $1$i
    i=»`expr $i + 1`»
    done

    Процедура mkfiles использует переадресацию вывода для  созда-
    ния файлов нулевой длины.  Команда expr используется для подсчета
    числа итераций в цикле while.

    7-66

    NULL

    :
    #   Формат: null files
    #   Создает каждый из указанных файлов как пустой.
    for eachfile
    do
    >$eachfile
    done

    Процедура использует тот факт, что в результате переадресации
    вывода, если выводного файла с таким именем нет, создается пустой
    выводной файл.

    PHONE

    :
    #   Формат: phone initials …
    #   Вывод номеров телефонов людей с
    #   указанными инициалами.
    echo ‘initsext home’
    grep «$1» <<END
    jfk  1234  999-2345
    lbj  2234  583-2245
    hst  3342  988-1010
    jqa  4567  555-1234
    END

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

    7-67

    TEXTFILE

    :
    if test «$1″= «-s»
    then
    #    Возвращает код завершения
    shift
    if test -z «`$0 $*`» # проверка возвращаемого значения
    then
    exit 1
    else
    exit 0
    fi
    fi
    if test $# -lt 1
    then echo  «$0: Usage: $0 [ -s ] file …» 1>&2
    exit 0
    fi
    file $* | fgrep ‘text’ | sed ‘s/:.*//’

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

    pr `textfile *` | lpr

    В процедуре используется флаг -s,  отбирающий из списка текс-
    товые файлы.

    WRITEMAIL

    :
    #   Формат: writemail message user
    #   Если пользователь зарегистрировался,
    #   сообщение выводится на терминал;
    #   в противном случае, посылается пользователю.
    echo «$1» | { write «$2» || mail «$2» ; }

    Иллюстрация использования командной группировки.   Сообщение,
    обозначенное как «$1», передается команде write, и, в случае неу-
    дачного завершения последней, команде mail.

    7-68

    Синтаксис Shell
    ————————————————————-

    элемент: слово
    ввод-вывод
    имя = значение

    простая-команда: элемент
    элемент простой-команды

    команда: простая-команда
    ( список-команд )
    { список-команд }
    for имя do список-команд done
    for имя in слово do список-команд done
    while список-команд do список-команд done
    until список-команд do список-команд done
    case слово in case-часть esac
    if список-команд then список-команд else-часть fi

    конвейер: команда
    конвейер | команда

    andor:   конвейер
    andor && конвейер
    andor || конвейер

    список-команд: andor
    список-команд ;
    список-команд &
    список-команд ; andor
    список-команд & andor

    ввод-вывод: > файл
    < файл
    << слово
    >> файл
    цифра > файл
    цифра < файл
    цифра >> файл

    7-69

    файл:    слово
    & цифра
    & —

    case-часть: шаблон ) список-команд ;;

    else-часть: elif список-команд then список-команд else-часть
    else список-команд
    пустая-строка

    пустая-строка:

    слово:   последовательность символов кроме пробелов

    имя:     последовательность букв, цифр или знаков подчеркива-
    ния, начинающаяся с буквы

    цифра:   0 1 2 3 4 5 6 7 8 9

    Метасимволы и зарезервированные слова

    1. Синтаксические

    |        символ канала
    &&       символ и-если
    ||       символ или-если
    ;        разделитель команд
    ;;       разделитель регистров
    &        фоновые команды
    ()       группирование команд
    <        перенаправление ввода
    <<       ввод из документа
    >        создание вывода
    >>       добавление к выводу
    #        комментарий в конце строки

     

    2. Шаблоны

    последовательность
    значение
    *отображает любой символ(ы) включая и его отсутствие
    ?отображает любой одиночный символ
    […]отображает любые символы в скобках

    3. Подстановки

    последовательность
    значение
    ${…}подстановка переменной оболочки
    `…`подстановка вывода команд

    4. Квотирование

    последовательность
    значение
    \квотирует следующий символ как литерал без специального значения
    ‘…’квотирует символы в кавычках за исключением обратной кавычки
    «…»квотирует символы в кавычках за исключением $`\»

    5. Зарезервированные слова

     if esac then for else while elif until fi do case done in {}
Command Line Interpreters: POSIX Shell, Cmd.exe, PowerShell

a side-by-side reference sheet

grammar and execution | variables and expression | arithmetic and logic | strings | regexes | dates and time | arrays | functions | execution control | exceptions | streams | files | directories | processes and environment | libraries and namespaces | reflection | debugging and profiling

posix shellcmd.exepowershell
version useddash; POSIX 20086.34.0
show version displayed at startup$host.version
grammar and execution
 posix shellcmd.exepowershell
interpreter$ dash foo.shwhen foo.bat is in the search path:
> foo
PS> .\foo.ps1

DOS> powershell -file foo.ps1

repl$ dash> cmd> powershell
execute command and exit$ dash -c ‘echo hi’> cmd /c «echo hi»> powershell -command ‘write-output «hi»‘
statement separatorpipelines separated by
; & && ||
lists of pipelines separated by newlines unless newline is preceded by a backslash or inside these characters:
«» » « ()
pipelines separated by & && ||

lists of pipelines separated by newline unless preceded by caret ^ which is not inside double quote «

; or newline; a newline can be escaped with a backtick: ` newlines are permitted in double quotes and after a pipe: |
word separators| & ; ( ) < > space tab| & < > space tab 
escape special character# write «foo» to foo.txt:
echo foo > foo.txt
# write «foo > foo.txt» to stdout:
echo foo \> foo.txt
rem write «foo» to foo.txt
echo foo > foo.txt
rem write «foo > foo.txt» to stdout:
echo foo ^> foo.txt
 
block delimiters{…}
(…)
do … done
( … ){ … }
are expressions statementsnono

relational expressions can only be used in the conditional of an if statement

arithmetic expressions can only be assigned to a variable using set /a

yes
end-of-line comment# commentrem comment

:: comment

# comment
comment out multiple lines<<EOF
comment
another comment
EOF
goto comment
comment
another comment
:comment
<# comment
another comment #>
variables and expressions
 posix shellcmd.exepowershell
assignmenta=1
whitespace next to = not permitted
set a=1$a = 1
parallel assignmentnonenone$a, $b = 1, 2
swaptmp=$a
a=$b
b=$tmp
set tmp=%a%
set a=%b%
set b=%tmp%
$a, $b = $b, $a
compound assignment operators: arithmetic, string, bitnone+= -= *= /= %=
none
«= »= &= |= ^=
+= -= *= /= %=
+= *=
none
increment and decrementnonenone$x = 1
$x++
$x—
variable declarationassignment, export, readonlyassignmentassignment
are identifiers case sensitive?yesnono
null»Variables must contain a non-empty string. This deletes the variable x:
set x=
$null
null testif [ -z $v ]
then
echo not defined
fi
if not defined v echo not defined$v -eq $null
arithmetic and logic
 posix shellcmd.exepowershell
true and falsestatus codes:
true false
inside [ ]:
1 »
no booleans; conditional of if statement must contain a relational expression$true $false
falsehoodsstatus codes:
nonzero integers
inside [ ]:
»
relational expressions which evaluate to false0 0.0 «» »
logical operatorsstatus codes:
&& || !
inside [ ]:
-a -o !
short-circuit operators:
&& ||
inside conditional of if:
not
-and -or -not
conditional expression$(( x>0 ? x : -x ))nonenone
relational expression[ $a -gt 3 ]%a% gtr 3$a -gt 3
relational operatorsintegers:
-eq -ne -gt -lt -ge -le
strings:
= != > < none none
equ neq gtr lss geq leq-eq -ne -gt -lt -ge -le
arithmetic expression$(( 1 + 3 ))arithmetic expression must be stored in a variable:
set /a «foo=1+3»
1 + 3
arithmetic operators+ — * none / % **

operators are integer-only in most shells; use bc for float arithmetic

+ — * none / % none

operators only work on integers

+ — * / ?? % ??
integer division$(( $a / $b ))set /a «result=7/3»$rem = $null
$quot = [Math]::DivRem($a, $b, [ref] $rem)
integer division by zerowrites «division by 0» error message; statement terminates with a 1 statusWrites «Divide by zero error.» and sets %errorlevel% to nonzero value.error: Attempted to divide by zero
float division`echo » scale=5; $a / $b » | bc`none$a / $b
float division by zerowrites «division by 0» error message; statement terminates with a 1 statusnoneevaluates to Infinity which is not a float literal
power none[Math]::pow(2, 32)
sqrt none[Math]::sqrt(2)
sqrt -2no sqrtnoneevaluates to NaN which is not a float literal
transcendental functionse l s c none none none a none
how to use:
`echo ‘e(2)’ | bc -l`
none[Math]::exp [Math]::log
[Math]::sin [Math]::cos [Math]::tan
[Math]::asin [Math]::acos [Math]::atan
[Math]::atan2
float truncation
round towards zero, round to nearest integer, round down, round up
none and no floatsnone[Math]::truncate(3.14)
[Math]::round(3.14)
[Math]::floor(3.14)
[Math]::ceiling(3.14)
absolute value
and signum
 none[Math]::abs(-7)
[Math]::sign(-7)
integer overflowmodular arithmeticsometimes modular arithmetic; sometimes writes error message and sets %errorlevel% to nonzero value.converts to float
float overflowno floatsnoneevaluates to Infinity which is not a float literal
random integer, uniform floatecho $RANDOM 15 bit integerrem integer in range 0 to 32767:
echo %random%
random 100
random 1.0
seed random numbersRANDOM=17
r=$RANDOM
none$r = random -setseed 17
bit operators<< >> & | ^ ~use with set /a:
<< >> & | ^ ~
none none -band -bor -bxor -bnot

# powershell 3.0:
-lsl -lsr

strings
 posix shellcmd.exepowershell
string literal‘don’\»t say «no»‘
«don’t say \»no\»»
$’don\’t say «no»‘
None; barewords are used for strings.

Double quotes are used for file names which contain spaces and other special characters. However, the double quotes are stored in the variables and passed to commands.

‘don»t say «no»‘
«don’t say `»no`»»
newline in literalyesNo; a bareword string can be continued on the following line by ending a line with ^; the CRLF is not part of the value of the string; it is not possible to store a CRLF in a variable.yes
barewordsyesyesyes
bareword escape characterbackslash: \;caret: ^<

Characters special to the interpreter can be stored in a variable by preceding them by a caret: ^; the interpreter will attempt to interpret them when the variable is dereferenced, however.

backquote:: `$
escapesgray|in double quotes##
\\ \»
in $’ ‘ quotes:
\a \b \e \f \n \r \t \v \\ \’ \cc \xhh \ooo
 `’ `» «
`0 `a `b `f `n `r `t `v
in other backtick sequences the backtick is ignored
variable interpolationcount=3
item=ball
«$count ${item}s»
 $count = 3
$item = «ball»
«$count $($item)s»
lengths=»hello»
${#s}
see footnote$s = «hello»
$s.length
string comparison[ $USER = foo ]
[ $USER != foo ]
 # case insensitive:
-eq -ne -gt -lt -ge -le
# case sensitive:
-ceq -cne -cgt -clt -cge -cle
index of substringnone returns -1 if not found:
«foo bar».indexof(«bar»)
extract substrings=»foo bar»
${s:4:3}
set s=foo bar
echo %s:~4:3%
«foo bar».substring(4, 3)
string concatenationc=»hello, «»world»rem trailing whitespace is stored:
set part1=hello,
set part2=world
echo %part1%%part2%
$c = «hello, » + «world»
string replication  $hbar = «-» * 80
splitnone «foo,bar,baz» -split «,»
joinnone @(«foo»,»bar»,»baz») -join «,»
sprintf`printf «tie: %s %d %f» «Spain» 13 3.7` $a = «Spain», 13, 3.7
«tie: {0} {1} {2}» -f $a
case manipulationecho «hello» | tr [a-z] [A-Z]
echo «HELLO» | tr [A-Z] [a-z]
A=hello
echo -n ${A:0:1} | tr [a-z] [A-Z]; echo -n ${A:1}
 «hello».toupper()
«HELLO».tolower()
stripnone » hello «.trim()
pad on right, pad on left`printf «%-10s» «hello»`
`printf «%10s» «hello»`
 $s = «hello»
$s + » » * (10 — $s.length)
» » * (10 — $s.length) + $s
string to numberA=»12″
$(( 7 + $A ))
B=».037″
`echo 73.9 + $B | bc`
set x=»12″
set /a «result=7+%x%»
7 + «12»

73.9 + «.037»

number to stringall values are stringsall values are strings[convert]::tostring(7) + » items»

# or use variable interpolation

regular expressions
 posix shellcmd.exepowershell
regex matchs=hello
rx='[a-z][a-z]*’
if expr $s : $rx > /dev/null
then

fi
set s=hello
echo %s%|findstr /r «[a-z][a-z]*» && (echo match ) ^
|| (echo does not match)
if («hello» -match «^[a-z][a-z]*$») {

}
single substitutions=’do re mi mi mi’
s=$(echo $s | sed s/mi/ma/)
  
global substitutions=’do re mi mi mi’
s=$(echo $s | sed s/mi/ma/g)
set «s=do re mi mi mi»
echo %s:mi=ma%
$s = «do re mi mi mi»
$s = $s -replace «mi», «ma»
dates and time
 posix shellcmd.exepowershell
current datetimedate +’%Y-%m-%d %H:%M:%S’date /t && time /tget-date -format ‘yyyy-MM-dd HH:mm:ss’
get-date -uformat ‘%Y-%m-%d %H:%M:%S’
current unix epochdate +’%s’ get-date -uformat %s
format datetimedate -d ‘1970-01-01 00:00:00 UTC’ +’%s’ get-date -date ‘1970-01-01 00:00:00’ -uformat %s
arrays
 posix shellcmd.exepowershell
literalnums=(1 2 3 4)set nums=(1 2 3 4)$nums = 1 ,2 ,3, 4
$nums = @(1 ,2, 3, 4)
size${#nums[@]}set numsc=0
for %i in %nums% do set /a numsc+=1
echo %numsc%
$nums.Length
lookup${nums[0]} $nums[0]
updatenums[1]=5 $nums[0] = 5
slice${nums[@]:1:2} $nums[1..2]
concatenatea=(1 2 3)
b=(4 5 6)
c=(${a[@]} ${b[@]})
 @(1, 2, 3) + @(4, 5, 6)
iterate over elementsfor i in ${nums[@]}
do echo $i
done
 foreach ($i in $nums) {
write-output $i
}
sort  $a = 3, 2, 4, 1
$b = $a | Sort-Object
reverse  $a = 1, 2, 3
[array]::reverse($a)
functions
 posix shellcmd.exepowershell
defineadd() { echo $(( $1 + $2 )); }
or
function add { echo $(( $1 + $2 )); }
goto:eof
:add
set /a sum=%~1+%~2
echo %sum%
goto:eof
function add {
param ($a, $b)
$a + $b
}
calladd 1 2call:add 1 2add 1 2
missing argument behavior»parameter treated as undefined variable or as containing the empty string$null
extra argument behaviorignorednoneignored
default argumentnonenonefunction add {
param ($a=0, $b=0)
$a + $b
}
named parametersnonenoneadd -a 1 -b 2
return valuereturn arg available in $? variable if a positive integer smaller than 256  
anonymous function literalnonenone$f = { write-output «foo» }
call anonymous functionnonenone& $f
or
$x.invoke()
default scopeglobalgloballocal
nestNested function visible outside containing function.nonefunction add {
param ($a, $b)
function add2 {
param ($a2, $b2)
$a2 + $b2
}
add2 $a $b
}
# Nested function not visible outside of containing
# function; nested function can see local variables
# of containing function.
execution control
 posix shellcmd.exepowershell
ifif [ $n -eq 0 ]
then
echo «no hits»
elif [ $n -eq 1 ]
then
echo «1 hit»
else
echo $n » hits»
fi
if %n% equ 0 (
echo no hits
) else (
if %n% equ 1 (
echo one hit
) else (
echo %n% hits
)
)
if ($n -eq 0) {
write-output «no hits»
} elseif ($n -eq 1) {
write-output «one hit»
} else {
write-output «$n hits»
}
whilei=0
while [ $i -lt 10 ]
do i=$(($i + 1))
echo $i
done
set i=0
:loop
set /a i+=1
echo %i%
if %i% lss 10 goto :loop
$i = 0
while ($i -lt 10) {
write-output (++$i)
}
forfor i in 1 2 3
do
echo $i
done
set nums=(1 2 3 4)
for %%n in %nums% do echo %%n
for ($i=1; $i -le 3; $i++) {
write-output $i
}
breakbreak break
continuecontinue continue
exceptions
 posix shellcmd.exepowershell
raiseCommands which fail return nonzero exit status.

Exit status of last command stored in $?

Commands which fail return nonzero exit status.

Exit status of last command stored in %errorlevel%

throw «bam!»
handletrap ‘echo «risky failed»‘ ERR
risky
risky

if errorlevel 1 (
echo risky failed
)

try {
throw «bam!»
}
catch {
write-output «caught!»
}
uncaught exception behaviorstderr and continuestderr and continuescript exits
concurrency
 posix shellcmd.exepowershell
sleepsleep 10vista and later:
timeout 10
timeout 10
streams
 posix shellcmd.exepowershell
read line from stdin# stored in $ine:
read line
# with prompt:
read -p ‘line: ‘ line
rem stored in %line%:
set /p line=
rem with prompt:
set /p line=»line: «
$line = read-host

# with prompt:
$line = read-host ‘line’

write line to stdoutecho «hi world»echo hi worldwrite-output «hi world»
write formatted string to stdoutprintf ‘%.2f\n’ 3.1415  
write file to stdoutcat foo.txt  
write to standard errorecho «hi world» >&2echo hi world >&2 
iterate over file by lineawk ‘length($0) > 70 {print $0}’ /etc/passwd  
write to processecho «hi world» | wcecho hi world | find /c hi 
write to fileecho «hello» > /tmp/aecho hello > \tmp\a 
append to fileecho «hello» >> /tmp/aecho hello >> \tmp\a 
files
 posix shellcmd.exepowershell
create empty file# does not overwrite existing file, but updates
# last mod. time:
touch foo.txt
rem overwrites existing file:
type nul > foo.txt
# error if file exists:
new-item -type file foo.txt
file exists test, file regular testif [ -e foo.txt ]; then echo «exists»; fi
if [ -f foo.txt ]; then echo «regular»; fi
if exist foo.txt ( echo exists )

??

if (test-path foo.txt) { write-output «exists» }

if (test-path -pathtype leaf) {
write-output «regular»
}

file sizels -l foo.txtdir foo.txtget-childitem foo.txt
is readable, is writeable, is executableif [ -r /etc/passwd ]; then echo readable; fi
if [ -w /tmp ]; then echo writeable; fi
if [ -x /bin/ls ]; then echo executable; fi
  
set file permisionschmod 0600 foo.txt  
last modification timels -l foo.txtdir foo.txtget-childitem foo.txt
copy file, remove file, rename filecp /tmp/foo.txt /tmp/bar.txt
rm /tmp/foo.txt
mv /tmp/bar.txt /tmp/foo.txt
copy foo.txt bar.txt
del foo.txt
move bar.txt foo.txt
copy-item foo.txt bar.txt
remove-item foo.txt
move-item bar.txt foo.txt
create symlink, symlink test, readlinkln -s /etc/passwd /tmp/passwd
if [ -h /tmp/passwd ]; then echo «symlink»; fi
readlink /tmp/passwd
  
generate unused file namemktemp /tmp/fooXXXXX [System.IO.Path]::GetTempFileName()
directories
 posix shellcmd.exepowershell
working directory
get and set
echo $(pwd)
echo $PWD
cd /tmp
echo %cd%

chdir \windows

$loc = get-location
echo $loc
set-location \windows
program directorybash only:
«$( cd «$( dirname «${BASH_SOURCE[0]}» )» && pwd )»
echo %~dp0 
dirname and basenamedirname /etc/hosts
basename /etc/hosts
  
iterate over directory by filefor f in /etc/*
do
echo $f
done
  
make directorymkdir /tmp/foo.dmkdir foonew-item -type directory foo
recursive copycp -R /tmp/foo.d /tmp/bar.d  
remove empty directoryrmdir /tmp/foo.drmdir foo 
remove directory and contentsrm -rf /tmp/foo.drmdir /s /q foo 
directory testif [ -d /tmp ]; then echo directory; fi  
processes and environment
 posix shellcmd.exepowershell
command line args$1
$2
# number of args:
$#
# pass args as $# words to twiddle
twiddle «$@»
# pass args as one word to twiddle
twiddle «$*»
%1
%2
rem number of args:
set #=0
for %%i in %* do set /a #+=1
echo %#%
rem no way to pass argument with space
twiddle %*
 
program name$0%0 
environment variable
get, set, clear
shell variables are environment variables
$HOME
 $env:home
user id and nameid

# user name only; most systems:
whoami

  
exitexit 0rem batch script exits:
exit /b 0
rem also closes cmd.exe window:
exit 0
exit
external commandlsdirdir
command substitutions=$(ls)none$s=dir
speechmac only:
say «I’m a Mac»
 $sp = new-object -comobject «SAPI.SpVoice»
$sp.speak(«I’m a PC»)
command pathwhich ping get-command ping
set signal handlerfunction int_handler {
echo «exiting…»;
exit
}
trap int_handler INT
  
send signalkill -INT 1234
kill -KILL 1234
  
start job in backgroundsleep 1000 &  
suspend current job^Z  
terminate jobkill %1  
list jobsjobs  
background suspended jobbg %1  
bring background job into foregroundfg %1  
disown jobdisown %1  
libraries and namespaces
 posix shellcmd.exepowershell
library$ cat foo.sh
function add() {
echo $(($1 + $2));
}
 from directory in search path:

> type Modules\Foo\Foo.psm1
function add {
param ($a, $b)
$a + $b
}

import librarysource foo.sh
add 3 7
 import-module foo

add 1 2

library path environment variablenone $env:psmodulepath
reflection
 posix shellcmd.exepowershell
command line documentationman lshelp dirget-help get-childitem
list defined variablesprintenvsetget-variable
list available libraries  get-module -listavailable
debugging and profiling
check syntax$ apt-get install shellcheck
$ shellcheck foo.sh
  
flags for stronger errorsbash only:
bash -eu -o pipefail
-e: exit with nonzero status if command fails
-u: exit with nonzero status if undefined variable accessed
-o pipefail: exit with nonzero status if command in pipeline fails
  
cpu usagetime ls  
 posix shellcmd.exepowershell
 ______________________________________________________________________________________________________________________________________________________________________________

Общие

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

показать версию
Как получить версию.

cmd.exe

Номер версии, отображаемый при запуске, соответствует версии ядра Windows. 6.3 — это номер версии ядра Windows 8.1.

Грамматика и исполнение

переводчик
Обычное имя интерпретатора и способ его вызова.

оболочка posix:

В Unix сценарии выполняются путем передачи файла, содержащего сценарий, интерпретатору в качестве аргумента:

$ dash ~/configure.sh
Если установлен исполняемый бит, файл может быть запущен напрямую:

$ ~/configure.sh
Чтобы определить имя интерпретатора, который будет обрабатывать сценарий, Unix будет искать наличие shebang (#!) в начале файла. Если путь к команде следует за shebang, он будет использоваться для интерпретации скрипта. Если shebang отсутствует, сценарий будет интерпретироваться с помощью /bin/sh, который является bash в Mac OS X и Cygwin и dash в Ubuntu.

Аргументы командной строки, которые задают позиционные параметры $1, $2 и т. Д., Могут быть установлены при вызове следующим образом:

$ dash ~/configure.sh arg1 arg2
$ ~/configure.sh arg1 arg2
Аргументы также могут быть помещены в строку shebang, но это полезно только для передачи параметров в оболочку. Если файл foo.sh содержит

#!/bin/sh -x
, затем вызывая его как

./foo.sh
эквивалентно

/bin/sh -x foo.sh
Жесткое кодирование полного пути в shebang является распространенной причиной проблем с переносимостью, поскольку разные системы могут устанавливать интерпретатор в разных местах. Команда env позволяет избежать этой проблемы путем поиска команды в каталогах ПУТЕЙ:

#!/usr/bin/env lua
powershell:

В Windows файл является сценарием PowerShell, если он имеет суффикс .ps1. Нет необходимости отмечать скрипт как исполняемый. Однако PowerShell по умолчанию не настроен для запуска сценариев. Чтобы изменить конфигурацию, запустите PowerShell от имени администратора и выполните следующую команду:

set-executionpolicy remotesigned
Можно вызвать сценарий PowerShell, указав интерпретатор PowerShell в качестве команды и сценарий в качестве аргумента, но суффикс файла все равно должен быть ps1:

powershell -файл .\test.ps1

repl
Как вызвать REPL.

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

разделитель операторов
Как синтаксический анализатор определяет конец инструкции.

оболочка posix:

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

Конвейер оболочки posix представляет собой последовательность из одной или нескольких простых команд, соединенных каналами |. Оболочка выполняет команды параллельно и перенаправляет stdout каждой команды на stdin следующей команды. Статус выхода — это статус последней команды.

Управляющие операторы ; & && || являются разделителями трубопроводов. Точка с запятой ; принудительно выполняет последовательное выполнение. Амперсанд & выполняется параллельно. && выполняется в первом конвейере, который возвращает ненулевой статус. || выполняется в первом конвейере, который возвращает нулевой статус.

Список — это один или несколько конвейеров, соединенных операторами управления. Список может содержать точку с запятой ; или амперсанд & в конце. Список завершается новой строкой.

Новая строка не завершает список, если:

внутри одинарных кавычек «, двойных кавычек «», обратных кавычек ` или скобок ()
внутри блока, начинающегося с ключевых слов: for, select, case, if, while, until
Новая строка, которая обычно завершает оператор, может быть экранирована с помощью обратной косой черты.

Несколько списков могут быть сгруппированы внутри парных скобок ( ) или фигурных скобок { }. При группировке внутри скобок списки выполняются внутри подоболочки. Фигурные скобки, но не скобки в скобках, должны быть отделены от их содержимого пробелом. Кроме того, в фигурных скобках, но не в скобках, последний список должен заканчиваться точкой с запятой или новой строкой.

разделители слов

экранирующий специальный символ
Как избежать специального символа.

разделители блоков
Как разделяются блоки.

оболочка posix:

Блоки могут быть разделены ключевыми словами {}, () или do,done.

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

Если блок разделен символом (), то команды в блоке выполняются в подоболочке.

Блок разделяется символами do и done при использовании ключевых слов управления выполнением for, select, while и until.

Ключевые слова then и else оператора if запускают блоки, которые заканчиваются следующими elif, else или fi.

Ключевые слова function и if открывают блоки, которые заканчиваются конечными ключевыми словами. Ключевое слово repeat открывает блок, который завершается символом until.

к комментарию в конце строки
Как сделать оставшуюся часть строки комментарием.

многострочный комментарий
Как закомментировать несколько строк.

оболочка posix:

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

Переменные и выражения

назначение
Как присвоить значение переменной.

параллельное назначение
Как присваивать значения переменным параллельно.

менять
Как обменять значения, хранящиеся в двух переменных.

составные операторы присваивания: арифметические, строковые, битовые
Составные операторы присваивания для арифметических, строковых и битовых операций

powershell:

Обратите внимание, что /= выполняет деление с плавающей точкой, даже если оба операнда являются целыми числами.

Когда левый операнд является строкой, += объединяет правый операнд с левым операндом.

Когда левый операнд является строкой, а правый — целым числом, *= объединяет левый операнд с самим правым операндом раз.

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

объявление переменной
Как объявить переменную.

оболочка posix:

Следующие три строки имеют идентичное поведение:

A=»привет, мир»
объявить A=»привет, мир»
набрать A=»привет, мир»
Можно создать переменную, доступную только для чтения. Опять же, есть три способа:

только для чтения A=»не могу изменить»
объявить -r A=»не могу изменить»
набор текста -r A=»не могу изменить»
Переменные не экспортируются в подпроцессы, если они не объявлены экспортируемыми:

экспорт A=»экспортировано в подпроцесс»
объявить -x A=»экспортировано в подпроцесс»
typeset -x A=»экспортировано в подпроцесс»
Переменные, назначенные в той же строке, что и команда, не создаются, а только экспортируются в подпроцесс, который создает экземпляр команды:

РЕДАКТОР=фиксация emacs svn
По умолчанию переменные, определенные внутри функций, являются глобальными. Они могут быть объявлены локальными:

функция foo () {
local b=17
# отголоски 17:
echo $b
}
# эхо ничего не повторяет:
echo $b

чувствительны ли идентификаторы к регистру символов?
powershell:

Идентификаторы PowerShell не чувствительны к регистру.

нулевой
Нулевой литерал.

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

Арифметическая и логическая
оболочка posix:

Оболочка POSIX предоставляет по крайней мере три различных окружения для логических выражений, каждое со своими собственными операторами и значениями для true и false.

Логические выражения обычно встречаются в условных выражениях if, elif, while и until. Команда ожидается в качестве условного выражения. Команда выполняется, и возвращаемое нулевое значение обрабатывается как true, а ненулевое — как false.

коды состояния [ ] $(( ))
где используется команда аргумент
команды true true нет канонического значения true 1
false false » 0
ложных значений ненулевой статус выхода » 0
логических операторов && || ! -a -o ! && || !
группировка { } \( \) ( )
строковые реляционные операторы нет = != \< \> нет
арифметические реляционные операторы нет -eq -ne -lt -gt -le -ge == != < > <= >=
арифметические операторы нет нет + — * / % **
битовые операторы нет нет << >> & | ^ ~
оболочка posix: коды состояния:

Логические выражения могут быть сформированы с использованием кодов состояния, возвращаемых командами. Команды могут быть внешними, встроенными или определяемыми пользователем функциями. Код состояния, равный нулю, используется для указания успеха, и для целей логики ноль рассматривается как истина, а все остальные коды состояния — как ложь.

Операторы && и || являются операторами короткого замыкания. Восклицательный знак! может использоваться для отмены кода состояния команды. Нет необходимости отделять && и || от их операндов пробелами, но необходимо отметить a ! используется как отрицание с пробелом.

оболочка posix: тестовая команда:

оболочка posix: арифметическое расширение:

истинное и ложное
Литералы для true и false.

ложь
Значения, которые являются ложными в условных выражениях.

логические операторы
Логично и, или, и нет.

оболочка posix:

&& || и ! доступны внутри [[ ]], (( )), и выражения $(( )). Внутри выражений [ ] используются -a, -o и !.

условное выражение
Синтаксис для условного выражения.

являются выражениями утверждениями
Можно ли использовать выражение там, где ожидается утверждение.

оболочка реляционных выражений
posix:

В Bash есть три типа реляционных выражений: [[ ]], [ ] и (( )). Для получения описания [ ] прочтите справочную страницу для тестирования.

(( )) оценивает его содержимое таким же образом, как и арифметическое расширение $(( )). Если результат равен нулю, он возвращает 1 (false). В противном случае он возвращает 0 (true).

[[ $a == шаблон ]] и [[ $a != шаблон ]] интерпретируют * и ? на правой стороне в виде узоров. Таким образом, «привет» == «ад *» истинно. Для числового сравнения используйте [ $a -eq num ] или [ $a -ne num ].

В выражениях Bash более подробно рассматриваются различные типы выражений bash.

реляционные операторы
posix shell:

Если == и =! имеют строку без кавычек справа, то * и ? внутри строки будут рассматриваться как подстановочные знаки для сопоставления.

преобразование из строки
posix shell:

Все значения являются строками. Оператор $(( )) интерполирует любые переменные, а затем вычисляет результирующую строку как арифметическое выражение, состоящее из целых чисел. Переменные не ограничиваются целыми числами. Следующий скрипт выводит 10:

А=7+3

Источники информации:

4 комментария для “Ярлык ссылка на url directory shell cmd как удалить

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *