Как создать файл сценария для команд терминала?


114

В Windows я могу написать файл, содержащий команды для cmd (обычно .cmdили .batфайлы). Когда я нажимаю на эти файлы, он открывает cmd.exeи запускает команды, содержащиеся в файле.

Как бы я сделал это в Ubuntu?

Я уверен, что это дубликат, но я не могу найти свой ответ.
Это похоже на эти вопросы, но они не отвечают на вопрос:

Храните часто используемые команды терминала в файле

Эмулятор CMD.exe в Ubuntu для запуска файла .cmd / .bat

Ответы:


150

Есть два метода.

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

#!/bin/bash

Затем сохраните файл. Далее отметьте его как исполняемыйchmod +x file

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

Несколько заметок:

  • Любой (и я имею в виду любой) файл может быть выполнен в Linux при условии, что в первой строке указан путь к программе, которая должна интерпретировать файл. Типичные примеры включают /bin/python, /bin/sh, /bin/dash, но даже нечетные шары работают вещи , как/bin/mysql
  • Баш это полный язык. Это намного сложнее, чем cmd.exe в Windows. Он имеет сильный язык программирования, который поддерживает функции, циклы, условные выражения, строковые операции и т. Д.
  • Эти документы могут помочь, если у вас возникнут проблемы.
  • Если вы не хотите делать файл исполняемым, вы можете запустить его, передав его в качестве аргумента bash: bash file/to/run.sh

Простой пример Bash

#!/bin/bash  
echo "This is a shell script"  
ls -lah  
echo "I am done running ls"  
SOMEVAR='text stuff'  
echo "$SOMEVAR"

Второй способ заключается в записи команд с помощью script. Беги, scriptпотом просто делай вещи. Когда вы закончите делать тип вещи exitи скрипт создаст для вас файл со всеми «вещами», которые вы сделали. Это менее используется, но работает довольно хорошо для создания таких вещей, как макросы. man scriptдля получения дополнительной информации.


Возможно, вы захотите изменить это /bin/bashна /bin/shbash, даже не Ubuntu по умолчанию.
TC1

@ TC1 Он установлен по умолчанию, поэтому не имеет значения, установлен он по умолчанию или нет.
Карлос Кампдеррос

1
Я хотел бы отметить, что /bin/dash(который /bin/shобычно является символической ссылкой) намного быстрее, чем bash (я измерял примерно в 15 раз быстрее). Если это вообще возможно, используйте /bin/dashдля сценариев оболочки :)
MiJyn

4
Если вы находитесь в той же папке, что и файл, убедитесь, что ./file.sh
coteyr

1
Я попробовал оба метода, но если я попытаюсь дважды щелкнуть файл скрипта bash, он просто откроет текстовый файл в geany / gedit, готовый для редактирования. Я бы хотел, чтобы скрипт выполнялся по двойному щелчку. Этот вопрос содержит более подробную информацию о том, что я хочу сделать.
тимаро

15

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

touch file

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

echo "text" > file

Этот метод перезаписывает содержимое fileв text. Если вы хотите очистить файл, вы можете просто сделать это:

echo "" > file

Скажем, вы хотите написать более одной строки, и не хотите использовать тысячи echoкоманд, вы должны использовать эту команду:

cat << EOF > file
test
test1
foo
bar
EOF

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

test
test1
foo
bar

Если вы хотите добавить файл, замените >на >>.

Надеюсь это поможет!


РЕДАКТИРОВАТЬ : О, я вижу, чтобы вы написали файл в Gedit, используя .shрасширение (необязательно, но это хорошая идея), а затем в файловом менеджере, щелкните правой кнопкой мыши файл, выберите Свойства-> Разрешения и проверьте Allow executing file as program, Тогда вы можете дважды щелкнуть по нему, и он будет работать :). Кроме того, если вы хотите сделать это в терминале, вы можете запустить эту команду, чтобы сделать ее исполняемой (вы можете добавить ее, sudoесли она не принадлежит вам):

chmod +x file

И запустить:

./file

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

Отличный ответ, внимательное обновление. Чтобы просто создать файл, я всегда просто использовалtouch filename
TryTryAgain

@TryTryAgain, да, это простой метод, вероятно, быстрее, чем echo "" > file. Это нормально, если я включу этот метод в свой ответ?
MiJyn

@MiJyn Абсолютно включить его, не стесняйтесь. Спасибо
TryTryAgain

Как я могу сделать это для запуска в любом месте в терминале ... как глобальная команда?
Омер

14

Эквивалентом пакетных файлов Windows являются сценарии оболочки, а отличным руководством по началу работы является Bash Scripting .

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

Пара вещей, которые отличаются от командных файлов Windows:

  • Существуют разные интерпретаторы команд, называемые оболочками. По умолчанию используется bash, но если вам интересно, есть и другие, такие как zsh, ksh, dash, perl, python и т. Д.

  • Чтобы запустить скрипт оболочки, вам нужно сделать исполняемый файл, что вы можете сделать с chmod +x <filename>

  • В Ubuntu текущим каталогом не является путь поиска программы, поэтому вам нужно запустить ./<filename>, а не<filename>

  • Имена переменных $<varname>не%<varname>%

  • Команды в сценарии оболочки по умолчанию не печатаются, как в командном файле.

  • Расширение имени файла может быть .shили (более привычным) вам не нужно использовать расширение. Поместите #!/bin/bashв самую первую строку файла , которая говорит Ubuntu, какую программу использовать для запуска файла.

  • Комментарии начинаются с #, а не rem.

Надеюсь, что это поможет и получайте удовольствие от написания сценариев!

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.