Jump to content

оболочка C

оболочка C
Оригинальный автор(ы) Билл Джой
Первоначальный выпуск 1978 год ; 46 лет назад ( 1978 )
Стабильная версия
6.20.00 / 24 ноября 2016 г .; 7 лет назад ( 24.11.2016 ) [1]
Репозиторий
Написано в С
Операционная система BSD , UNIX , UNOS , Linux , macOS
Тип оболочка Unix
Лицензия Лицензия BSD
Оболочка C, работающая в службах Windows для UNIX

Оболочка C ( csh или улучшенная версия tcsh ) — это оболочка Unix, созданная Биллом Джоем , когда он был аспирантом Калифорнийского университета в Беркли в конце 1970-х годов. Он получил широкое распространение, начиная с версии 2BSD пакета Berkeley Software Distribution (BSD), который Джой впервые распространил в 1978 году. [2] [3] Другими ранними авторами идей и кодекса были Майкл Убелл, Эрик Оллман , Майк О'Брайен и Джим Калп. [4]

Оболочка C — это командный процессор , который обычно запускается в текстовом окне, позволяя пользователю вводить и выполнять команды. Оболочка C также может читать команды из файла, называемого скриптом . Как и все оболочки Unix, он поддерживает подстановочные знаки в именах файлов , конвейерную обработку , здесь документы , подстановку команд , переменные и структуры управления для проверки условий и итерации . Что отличало оболочку C от других, особенно в 1980-х годах, так это ее интерактивные функции и общий стиль. Новые функции сделали его проще и быстрее в использовании. Общий стиль языка больше напоминал C и считался более читабельным.

Во многих системах, таких как macOS и Red Hat Linux , csh на самом деле является tcsh , улучшенной версией csh. Часто один из двух файлов является либо жесткой ссылкой , либо символической ссылкой на другой, так что любое имя относится к одной и той же улучшенной версии оболочки C. Исходный исходный код и двоичный файл csh являются частью NetBSD .

В Debian и некоторых его производных (включая Ubuntu ) есть два разных пакета: csh и tcsh. Первый основан на оригинальной версии csh для BSD. [5] [6] и последний — улучшенный tcsh. [7] [8]

В tcsh добавлены концепции завершения имени файла и команды, а также редактирования командной строки, заимствованные из системы Tenex , которая является источником буквы «t». [9] Поскольку он только добавлял функциональность и не менял уже существующее, tcsh оставался обратно совместимым. [10] с оригинальной оболочкой C. Хотя tcsh начинался как побочная ветвь исходного дерева, созданного Джой, сейчас он является основной ветвью для продолжающейся разработки. tcsh очень стабилен, но новые выпуски продолжают появляться примерно раз в год и состоят в основном из мелких исправлений ошибок. [11]

Цели и особенности проектирования

[ редактировать ]

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

Больше похоже на С

[ редактировать ]

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

По сегодняшним стандартам оболочка C может показаться не более похожей на C, чем многие другие популярные языки сценариев. Но в 80-х и 90-х годах разница была поразительной, особенно по сравнению с оболочкой Bourne (также известной как sh ), доминирующей в то время оболочкой, написанной Стивеном Борном из Bell Labs . оболочки выражений Этот пример иллюстрирует более традиционные операторы и синтаксис C.

Оболочка Борна

#!/bin/sh
if [ $days -gt 365 ]
then
   echo This is over a year.
fi

оболочка C

#!/bin/csh
if ( $days > 365 ) then
   echo This is over a year.
endif

У Борна не было грамматики выражений . Условие в квадратных скобках необходимо было оценить с помощью более медленного запуска внешней тестовой программы. ш if Команда приняла слова аргументов как новую команду, которую нужно запустить как дочерний процесс . Если ребенок вышел с нулевым кодом возврата , sh будет искать then предложение (отдельный оператор, но часто записываемый в одной строке с точкой с запятой) и запустить этот вложенный блок. В противном случае он будет запускать else. Жесткая привязка тестовой программы как к " test" и " [" дало преимущество квадратных скобок в обозначениях и создало видимость того, что функциональность test является частью языка sh. Использование в sh обратного ключевого слова для обозначения конца управляющего блока было стилем, заимствованным из ALGOL 68 . [12]

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

Вот второй пример, сравнивающий скрипты, вычисляющие первые 10 степеней двойки.

Оболочка Борна

#!/bin/sh
i=2
j=1
while [ $j -le 10 ]
do
   echo '2 **' $j = $i
   i=`expr $i '*' 2`
   j=`expr $j + 1`
done

оболочка C

#!/bin/csh
set i = 2
set j = 1
while ( $j <= 10 )
   echo '2 **' $j = $i
   @ i *= 2
   @ j++
end

Опять же, из-за отсутствия грамматики выражений, сценарий sh использует подстановку команд и команду expr . (Современная оболочка POSIX имеет такую ​​грамматику: оператор можно написать i=$((i * 2)) или : "$((i *= 2))".)

Наконец, вот третий пример, показывающий различные стили оператора переключателя .

Оболочка Борна

#!/bin/sh
for i in d*
do
   case $i in
      d?) echo $i is short ;;
      *) echo $i is long ;;
   esac
done

оболочка C

#!/bin/csh
foreach i ( d* )
   switch ( $i )
      case d?:
         echo $i is short
         breaksw
      default:
         echo $i is long
   endsw
end

В сценарии sh " ;;" отмечает конец каждого случая, поскольку в противном случае sh запрещает пустые операторы.

Улучшения для интерактивного использования

[ редактировать ]

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

История позволяет пользователям вызывать предыдущие команды и повторно запускать их, набрав всего несколько быстрых нажатий клавиш. Например, набрав два восклицательных знака (" !!") [13] как команда вызывает выполнение непосредственно предшествующей команды. Другие короткие комбинации клавиш, например: " !$" (что означает "последний аргумент предыдущей команды") позволяет объединять фрагменты предыдущих команд и редактировать их для формирования новой команды.

Редактирование операторов

[ редактировать ]

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

Псевдонимы

[ редактировать ]

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

Стек каталогов

[ редактировать ]

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

Обозначение тильды

[ редактировать ]

Обозначение тильды предлагает сокращенный способ указания путей относительно домашнего каталога с помощью « ~" характер.

Завершение имени файла

[ редактировать ]

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

Cdpath расширяет понятие пути поиска до cd Команда (изменить каталог): Если указанный каталог не находится в текущем каталоге , csh попытается найти его в каталогах cdpath.

Контроль заданий

[ редактировать ]

В 1980-е годы у большинства пользователей были только простые терминалы с символьным режимом, исключавшие использование нескольких окон, поэтому они могли работать только над одной задачей одновременно. Управление заданиями оболочки C позволяло пользователю приостановить текущую деятельность и создать новый экземпляр оболочки C, называемый заданием, набрав ^Z. Затем пользователь мог переключаться между заданиями, используя fg команда. Говорят, что активная работа была на переднем плане. Сообщалось, что другие задания были либо приостановлены (остановлены), либо выполнялись в фоновом режиме .

Хеширование пути

[ редактировать ]

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

Обзор языка

[ редактировать ]

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

Основные положения

[ редактировать ]

Базовый оператор — это тот, который просто запускает команду. Первое слово используется как имя запускаемой команды и может быть внутренней командой, например: echoили внешняя команда. Остальные слова передаются в качестве аргументов команды.

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

Подстановочные знаки

[ редактировать ]

Оболочка C, как и все оболочки Unix, рассматривает любой аргумент командной строки, содержащий подстановочные знаки, как шаблон и заменяет его списком всех соответствующих имён файлов (см. подстановку ).

  • * соответствует любому количеству символов.
  • ? соответствует любому отдельному символу.
  • [... ] соответствует любому из символов внутри квадратных скобок. Допускаются диапазоны с использованием дефиса.
  • [^... ] соответствует любому символу, не входящему в набор.

Оболочка C также представила несколько удобных обозначений (иногда называемых расширенным подстановкой ), поскольку они были скопированы другими оболочками Unix.

  • abc{def,ghi} представляет собой чередование (также известное как расширение фигурных скобок ) и расширяется до abcdef abcghi .
  • ~ означает домашний каталог текущего пользователя.
  • ~user означает домашний каталог пользователя .

Несколько подстановочных знаков на уровне каталога, например " */*.c", поддерживаются.

Начиная с версии 6.17.01, рекурсивные подстановочные знаки а-ля zsh (например, " **/*.c" или " ***/*.html") также поддерживается с помощью globstar вариант.

Возложение на оболочку ответственности за интерпретацию подстановочных знаков было важным решением в Unix. Это означало, что подстановочные знаки будут работать с каждой командой и всегда одинаково. Однако это решение основывалось на способности Unix эффективно передавать длинные списки аргументов через системный вызов exec , который csh использует для выполнения команд. Напротив, в Windows интерпретация подстановочных знаков обычно выполняется каждым приложением. Это наследие MS-DOS, которое позволяло передавать приложению только 128-байтовую командную строку, что делало использование подстановочных знаков в командной строке DOS непрактичным. Хотя современная Windows может передавать командные строки длиной примерно до 32 000 символов Юникода , бремя интерпретации подстановочных знаков остается на приложении.

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

[ редактировать ]

По умолчанию, когда csh запускает команду, она наследует дескрипторы файлов stdio csh для stdin , stdout и stderr , которые обычно указывают на окно консоли , в котором работает оболочка C. Операторы перенаправления ввода-вывода позволяют команде вместо этого использовать файл для ввода или вывода.

  • > file означает, что стандартный вывод будет записан в файл , перезаписав его, если он существует, и создав его, если его нет. В окно оболочки по-прежнему приходят ошибки.
  • >& file означает, что и stdout, и stderr будут записаны в файл , перезаписывая его, если он существует, и создавая его, если его нет.
  • >> file означает, что стандартный вывод будет добавлен в конец файла .
  • >>& file означает, что и stdout, и stderr будут добавлены в конец файла .
  • < file означает, что стандартный ввод будет прочитан из файла .
  • << строка — это документ здесь . Stdin прочитает следующие строки до той, которая соответствует строке .

Перенаправление одного лишь stderr невозможно без помощи подоболочки.

set filter = "$home"'/filter'
mkfifo ”$filter"
cat "$filter" & ( ( ls /root/ || echo No access. ) > "$filter" ) >& /dev/null

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

( ( ( echo ok ; '' ) > /dev/fd/0 ) >& /dev/null < /dev/fd/1 ) | ( echo "$<" bye )

Присоединение

[ редактировать ]

Команды могут быть объединены в одной строке.

  • ; означает запуск первой команды, а затем следующей.
  • && означает запустить первую команду и, если она завершится успешно с кодом возврата 0 , запустить следующую.
  • || означает запустить первую команду и, если она завершится неудачей с ненулевым кодом возврата, запустить следующую.

Трубопроводы

[ редактировать ]

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

  • | означает подключение стандартного вывода к стандартному вводу следующей команды. В окно оболочки по-прежнему приходят ошибки.
  • |& означает подключение stdout и stderr к стандартному вводу следующей команды.

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

По команде, например: " a | b", оболочка создает канал , а затем запускает оба a и b с помощью stdio для двух команд, перенаправленных так, что a записывает свой стандартный вывод на вход канала, пока b читает стандартный ввод с вывода канала. Каналы реализуются операционной системой с определенным объемом буферизации, поэтому a может писать некоторое время, прежде чем канал заполнится, но как только канал заполнится, любая новая запись будет блокироваться внутри ОС до тех пор, пока b читает достаточно, чтобы разблокировать новые записи. Если b пытается прочитать больше данных, чем доступно, он будет заблокирован до тех пор, пока a записал больше данных или пока канал не закроется, например, если a выходит.

Замена переменной

[ редактировать ]

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

Цитирование и побег

[ редактировать ]

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

  • \ означает принять следующий символ как обычный буквальный символ.
  • "нить " это слабая цитата. Закрытые пробелы и подстановочные знаки воспринимаются как литералы, но замены переменных и команд по-прежнему выполняются.
  • 'нить ' это сильная цитата. Вся заключенная строка воспринимается как литерал.

Двойные кавычки внутри двойных кавычек следует экранировать с помощью "\"". То же самое относится и к символу доллара, чтобы предотвратить расширение переменной. "\$". Для обратных кавычек, чтобы предотвратить вложенность подстановок команд, требуются одинарные кавычки. "'\`'".

Замена команды

[ редактировать ]

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

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

Ниже приведен пример вложенных подстановок команд.

echo "`echo "\"\`"echo "\"\\\"\\\`\""echo "\"\\\"\\\\\\\"\\\\\\\`\\\"\""echo "\"\\\"\\\\\\\"\\\\\\\\\\\\\\\"\\\\\\\\\\\\\\\`\\\\\\\"\\\"\""echo "\"\\\"\\\\\\\"\\\\\\\\\\\\\\\"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\`\\\\\\\\\\\\\\\"\\\\\\\"\\\"\""pwd"\"\\\"\\\\\\\"\\\\\\\\\\\\\\\"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\`\\\\\\\\\\\\\\\"\\\\\\\\\\\\\\\`\\\\\\\\\\\\\\\"\\\\\\\"\\\\\\\`\\\\\\\"\\\"\\\`\\\"\"\`\""`"

Фоновое выполнение

[ редактировать ]

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

  • команда & означает запуск команды в фоновом режиме и немедленный запрос новой команды.

Подоболочки

[ редактировать ]

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

  • ( команды ) означает запуск команд в подоболочке.

Структуры управления

[ редактировать ]

Оболочка C предоставляет структуры управления как для проверки условий , так и для итерации . Структурами управления проверкой условий являются операторы if и switch. Структурами управления итерацией являются операторы while, foreach и повтор.

если заявление

[ редактировать ]

Существует две формы оператора if . Краткая форма вводится в одну строку, но может указывать только одну команду, если выражение истинно.

if ( expression ) command

В длинной форме используются ключевые слова then, else и endif, позволяющие вкладывать блоки команд внутри условия.

if ( expression1 ) then
    commands
else if ( expression2 ) then
    commands
    ...
else
    commands
endif

Если ключевые слова else и if встречаются в одной строке, csh объединяет их в цепочки, а не вкладывает; блок завершается одним endif.

оператор переключения

[ редактировать ]

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

switch ( string )
    case pattern1:
        commands
        breaksw
    case pattern2:
        commands
        breaksw
        ...
    default:
        commands
        breaksw
endsw

оператор while

[ редактировать ]

Оператор while оценивает выражение. Если это правда, оболочка выполняет вложенные команды, а затем повторяет это до тех пор, пока выражение остается истинным.

while ( expression )
    commands
end

оператор foreach

[ редактировать ]

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

foreach loop-variable ( list-of-values )
    commands
end

повторить заявление

[ редактировать ]

Оператор повторения повторяет одну команду целое число раз.

repeat integer command

Переменные

[ редактировать ]

Оболочка C реализует как переменные оболочки, так и переменные среды . [14] Переменные среды, созданные с помощью setenv всегда представляют собой простые строки, передаваемые любым дочерним процессам , которые извлекают эти переменные через envp[] аргумент для main().

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

В текущих версиях csh строки могут иметь произвольную длину, вплоть до миллионов символов.

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

# Creates a variable large enough to hold 1024 elements.
set fixed = {,}{,}{,}{,}{,}{,}{,}{,}{,}{,}

Выражения

[ редактировать ]

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

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

// C groups from the left
int i = 10 / 5 * 2;
printf( "%d\n", i ); // prints 4
i = 7 - 4 + 2;
printf( "%d\n", i ); // prints 5
i = 2 >> 1 << 4;
printf( "%d\n", i ); // prints 16
# C shell groups from the right
@ i = 10 / 5 * 2
echo $i # prints 1
@ i = 7 - 4 + 2
echo $i # prints 1
@ i = ( 2 >> 1 << 4 )
echo $i # prints 0

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

Возвращаемые значения ограничены 8-битными значениями. Для exit выражения, унарный оператор отрицания можно использовать для 32-битной оценки.

exit ! ! 256 # Returns 1.

Хотя сам Стивен Борн признавал, что csh превосходит его оболочку в интерактивном использовании, [15] он никогда не был так популярен для написания сценариев.

В 1983 году и csh, и оболочка Bourne были доступны для операционной системы UNOS компании Charles River Data Systems среди других инструментов UNIX по лицензии Bell Laboratories . [16]

Первоначально и в течение 1980-х годов нельзя было гарантировать присутствие csh во всех Unix и Unix-подобных системах, но sh мог, что делало его лучшим выбором для любых сценариев, которые, возможно, придется запускать на других машинах. К середине 1990-х годов csh был широко доступен, но использование csh для написания сценариев подверглось новой критике со стороны комитета POSIX . [17] в котором указано, что должна быть только одна предпочтительная оболочка, KornShell , как для интерактивных целей, так и для сценариев. Оболочка C также подверглась критике со стороны других. [18] [19] по поводу предполагаемых дефектов синтаксиса оболочки C, отсутствующих функций и плохой реализации.

  • Дефекты синтаксиса: как правило, это были простые, но ненужные несоответствия в определении языка. Например, set, setenv и alias все команды делали по сути одно и то же, а именно связывали имя со строкой или набором слов. Но у всех троих были небольшие, но ненужные различия. Знак равенства был необходим для set но не для setenv или alias; круглые скобки требовались вокруг списка слов для set но не для setenv или aliasи т. д. Аналогично if, switch и конструкции цикла используют неоправданно разные ключевые слова ( endif, endsw и end), чтобы завершить вложенные блоки.
  • Отсутствующие функции: чаще всего упоминается отсутствие возможности независимого манипулирования дескрипторами файлов stdio и поддержки функций. Несмотря на отсутствие поддержки функций, псевдонимы служат обходным решением. Для нескольких строк кода псевдонимы должны быть заключены в одинарные кавычки, а каждому концу строки должна предшествовать обратная косая черта (конец последней строки должен предшествовать одинарной кавычке, ограничивающей конец псевдонима). Рекурсия предпочтительнее псевдонимов в скриптах в качестве обходного пути для функций (пример приведен ниже).
  • Реализация:, в которой использовался специальный парсер , вызвала самую серьезную критику. К началу 1970-х годов технология компиляторов была достаточно зрелой. [20] что большинство новых языковых реализаций использовали либо нисходящий , либо восходящий синтаксический анализатор, способный распознавать полностью рекурсивную грамматику . Неизвестно, почему для оболочки C был выбран специальный дизайн. Возможно, дело просто в том, что, как сказал Джой в интервью в 2009 году: «Когда я начал заниматься этим с Unix, я был не очень хорошим программистом». [21] Специальный дизайн означал, что язык оболочки C не был полностью рекурсивным. Был предел тому, насколько сложную команду он мог обработать.

Он работал для большинства команд, вводимых в интерактивном режиме, но для более сложных команд, которые пользователь мог написать в сценарии, он мог легко выйти из строя, выдавая только загадочное сообщение об ошибке или нежелательный результат. Например, оболочка C не могла поддерживать связь между структурами управления. Попытка передать вывод foreach команда в grep просто не сработало. (Обходной путь, который работает при многих жалобах, связанных с синтаксическим анализатором, заключается в разбиении кода на отдельные сценарии. Если foreach перемещается в отдельный скрипт, конвейер работает, поскольку сценарии запускаются путем разветвления новой копии csh, которая наследует правильные дескрипторы stdio. Также возможно взломать коды в одном файле. Ниже приведен пример того, как взломать коды в одном файле.)

Другой пример — нежелательное поведение в следующих фрагментах. Оба эти слова, похоже, означают: «Если «myfile» не существует, создайте его, вписав в него «mytext». Но версия справа всегда создает пустой файл, поскольку порядок оценки оболочки C заключается в поиске и оценке операторов перенаправления ввода-вывода в каждой командной строке по мере ее чтения, прежде чем проверять остальную часть строки, чтобы увидеть, содержит ли она управляющая структура.

# Works as expected
if ( ! -e myfile ) then
   echo mytext > myfile
endif
# Always creates an empty file
if (! -e myfile) echo mytext > myfile
# Workaround (only for tcsh)
if (! -e myfile) eval "echo mytext > myfile"
# Second workaround (for csh and tcsh)
( exit ( -e myfile ) && ( ( echo mytext > myfile ) >& /dev/null || echo Cannot create file. ) || echo File exists.

Реализация также подвергается критике за общеизвестно плохие сообщения об ошибках, например, «0: Событие не найдено», которые не дают никакой полезной информации о проблеме.

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

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

#!/bin/csh -f
set cmdlist = ( 'date # 1'\
'uname # 2'\
'tty # 3'\
'id # 4' )
echo -n 'Enter a number to execute a command from the history: '
set cmdexec = "$<"
( exit ( ! ( "$cmdexec" > 0 && \
"$cmdexec" <= "$#cmdlist" ) ) ) >& /dev/null
if ( "$status" ) then
  echo 'Invalid event number.'
  foreach cmd ( $cmdlist:q )
    echo "$cmd"
  end
  exit -1
endif
eval "$cmdlist[$cmdexec]"

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

#!/bin/csh -f
if ( ! "$?main" ) then
  if ( ! "$?0" ) then
    echo 'You must run this script by explicitly calling its file.'
    exit -1
  endif
  alias function 'set argv = ( \!* ) ; source "$main"'
  set main = "$0"
  set ret = "`function myfunc`"
  echo "$ret"
  exit
endif

goto "$1" ; shift

myfunc:
function myfunc2
echo "A function."
exit

myfunc2:
echo "Another function."
exit
64-битная оболочка Hamilton C на рабочем столе Windows 7 .

Оболочка C была чрезвычайно успешной во внедрении большого количества нововведений, включая механизм истории , псевдонимы , нотацию тильды , интерактивное завершение имени файла, грамматику выражений, встроенную в оболочку, и многое другое, которые с тех пор были скопированы другими оболочками Unix. Но в отличие от sh , который породил большое количество независимо разработанных клонов, включая ksh и bash csh только два клона , известны . (Поскольку tcsh основан на коде csh, первоначально написанном Биллом Джоем, он не считается клоном.)

В 1986 году Аллен Голуб написал «По команде: написание Unix-подобной оболочки для MS-DOS» . [22] книга, описывающая написанную им программу под названием «SH», но которая на самом деле копирует дизайн и особенности языка csh, а не sh. Сопутствующие дискеты, содержащие полный исходный код SH и базового набора Unix-подобных утилит (cat, cp, grep и т. д.), были доступны у издателя за 25 и 30 долларов соответственно. Структуры управления, грамматика выражений, механизм истории и другие функции в SH Голуба были идентичны функциям оболочки C.

В 1988 году компания Hamilton Laboratories начала поставки оболочки Hamilton C для OS/2 . [23] Он включал в себя как клон csh, так и набор Unix-подобных утилит. В 1992 году для Windows NT была выпущена оболочка Hamilton C. [24] Версия для Windows продолжает активно поддерживаться, но версия OS/2 была прекращена в 2003 году. [24] Краткий справочник начала 1990-х годов. [25] описал намерение как «полное соответствие всему языку оболочки C (кроме управления заданиями )», но с улучшениями в конструкции языка и адаптацией к различиям между Unix и ПК. Самым важным улучшением был парсер сверху вниз , который позволял управляющие структуры вкладывать или передавать по конвейеру , что не могла поддерживать исходная оболочка C, учитывая ее специальный синтаксический анализатор. Гамильтон также добавил новые возможности языка, включая встроенные и определяемые пользователем процедуры, локальные переменные с блочной структурой и арифметику с плавающей запятой. Адаптация к ПК включала поддержку имен файлов и других соглашений на ПК, а также использование потоков вместо вилок (которые не были доступны ни в OS/2, ни в Windows) для достижения параллелизма , например, при настройке конвейера.

См. также

[ редактировать ]
  1. ^ Зулас, Христос (24 ноября 2016 г.). "tcsh-6.20.00 теперь доступен!" . mx.gw.com . Архивировано из оригинала 25 ноября 2016 года . Проверено 24 ноября 2016 г.
  2. ^ Харли Хан, Руководство Харли Хана по Unix и Linux. Архивировано 24 августа 2019 года в Wayback Machine .
  3. ^ Заметки инженерной лаборатории Беркли, том 1, выпуск 2, октябрь 2001 г. Архивировано 9 июля 2010 г. в Wayback Machine .
  4. ^ Введение в оболочку C. Архивировано 13 июля 2018 года в Wayback Machine Биллом Джоем .
  5. ^ Ubuntu — Подробная информация о пакете csh . Пакеты.ubuntu.com.
  6. ^ Debian — Подробная информация о пакете csh . Пакеты.debian.org.
  7. ^ Ubuntu — Подробная информация о пакете tcsh . Пакеты.ubuntu.com.
  8. ^ Debian — Подробная информация о пакете tcsh . Пакеты.debian.org.
  9. ^ Кен Грир (3 октября 1983 г.). «Оболочка C с распознаванием/дополнением команд и имен файлов» . Группа новостей : net.sources . Проверено 29 декабря 2010 г.
  10. ^ Справочная страница tcsh(1) . ткш.
  11. Файл исправлений в tcsh-17 июня 2000 г.
  12. ^ Re: Поздно расцветшие люди снова посетили сообщение USENET на comp.lang.misc Пьеркарло «Питер» Гранди, кафедра CS, UCW Аберистуит, Великобритания, 17 декабря 1989 г.
  13. ^ Произносится как «бэнг, бэнг»
  14. ^ Трой, Дуглас (1990). UNIX-системы . Основы вычислений. Бенджамин / Издательская компания Камминга. п. 25.
  15. ^ Борн, Стивен Р. (октябрь 1983 г.). «Оболочка Unix» . БАЙТ . п. 187 . Проверено 30 января 2015 г.
  16. ^ Путеводитель по Вселенной для инсайдеров (PDF) . Charles River Data Systems, Inc., 1983. с. 13.
  17. ^ Стандарт IEEE для информационных технологий, Интерфейс переносимой операционной системы (POSIX), Часть 2: Оболочка и утилиты, Том 2 . Стандарт IEEE 1003.2-1992, стр. 766-767. ISBN   1-55937-255-9 .
  18. ^ считает программирование Csh вредным Том Кристиансен
  19. ^ Десять главных причин не использовать оболочку C Брюса Барнетта
  20. ^ Дэвид Грис (1971). Создание компилятора для цифровых компьютеров. Джон Уайли и сыновья. ISBN   0-471-32776-X .
  21. Билл Джой в разговоре с Брентом Шлендером, Клуб Черчилля, Санта-Клара, Калифорния, 11 февраля 2009 г. Архивировано 30 марта 2010 г. в Wayback Machine .
  22. ^ Голуб, Аллен (1986–1987). По команде: написание Unix-подобной оболочки для MS-DOS (второе изд.). M&T Books, Редвуд-Сити, Калифорния. ISBN  0-934375-29-1 .
  23. ^ Гамильтон, Дуглас. «Объявление о оболочке Hamilton C» (PDF) . Разработчик персональных систем IBM (лето 1989 г.): 119–121 . Проверено 11 июля 2020 г.
  24. ^ Jump up to: а б Гамильтон, Николь (5 марта 2017 г.). «Оболочка Hamilton C для примечаний к выпуску Windows 5.2.g» . Hamilton Laboratories, Редмонд, Вашингтон . Проверено 3 апреля 2018 г.
  25. ^ Краткий справочник по оболочке Hamilton C (PDF) . Hamilton Laboratories, Вэйланд, Массачусетс. 1988–1990 гг . Проверено 11 июля 2020 г.

Дальнейшее чтение

[ редактировать ]
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: f37eb8c6c8143d359ec0b7ee41da1015__1717692000
URL1:https://arc.ask3.ru/arc/aa/f3/15/f37eb8c6c8143d359ec0b7ee41da1015.html
Заголовок, (Title) документа по адресу, URL1:
C shell - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)