Bash скрипт расширение файла
Если четвёртый символ это - то файл не является исполняемым.
Сделать его исполняемым можно командой
chmod u+x script_1
-rwxrw-r--. 1 andrei andrei 5252 May 13 02:47 script_1
Обратите внимание на -rwx теперь четвёртый символ это x
В моей CentOS настроена подсветка исполняемых файлов, поэтому он теперь зелёный
Теперь выполнить скрипт можно командой
Конкретно этот скрипт должен принимать аргументы из командной строки , поэтому мы выполним
./script_1 word1 word2
word1 добавится в log.txt а word2 нет, потому что word1 это первый аргумент а word2 второй.
Чтобы записывать вообще все аргументы заменим $1 на $*
Добавим в лог время выполнения команд (подробности здесь)
./script_1 one two three
cat log.txt
2022-05-13 02:47:40,404 one two three
Как назвать скрипт
Проверить не занято ли имя системой можно командой type.
Например, вы решили назвать свой скрипт test
test is a shell builtin
То есть имя занято, вы, конечно, можете его использовать, но с вызовом будут дополнительные сложности.
Как вызвать скрипт из другого скрипта
Допустим из скрипта parent.sh вам нужно вызвать скрипт child.sh
Это если они в одной директории, если в разных - пишите путь до скрипта
Объединить строки
Конкатенация строк может быть сделана следующим образом
5 Answers 5
Disagreeing with the other answers, there's a common convention to use a .sh extension for shell scripts -- but it's not a useful convention. It's better not to use an extension at all. The advantage of being able tell that foo.sh is a shell script because of its name is minimal, and you pay for it with a loss of flexibility.
To make a bash script executable, it needs to have a shebang line at the top:
and use the chmod +x command so that the system recognizes it as an executable file. It then needs to be installed in one of the directories listed in your $PATH . If the script is called foo , you can then execute it from a shell prompt by typing foo . Or if it's in the current directory (common for temporary scripts), you can type ./foo .
Neither the shell nor the operating system pays any attention to the extension part of the file name. It's just part of the name. And by not giving it a special extension, you ensure that anyone (either a user or another script) that uses it doesn't have to care how it was implemented, whether it's a shell script (sh, bash, csh, or whatever), a Perl, Python, or Awk script, or a binary executable. The system is specifically designed so that either an interpreted script or a binary executable can be invoked without knowing or caring how it's implemented.
UNIX-like systems started out with a purely textual command-line interface. GUIs like KDE and Gnome were added later. In a GUI desktop system, you can typically run a program (again, whether it's a script or a binary executable) by, for example, double-clicking on an icon that refers to it. Typically this discards any output the program might print and doesn't let you pass command-line arguments; it's much less flexible than running it from a shell prompt. But for some programs (mostly GUI clients) it can be more convenient.
Shell scripting is best learned from the command line, not from a GUI.
(Some tools do pay attention to file extensions. For example, compilers typically use the extension to determine the language the code is written in: .c for C, .cpp for c++, etc. This convention doesn't apply to executable files.)
Я написал скрипт bash в текстовом редакторе, какое расширение я сохраняю свой скрипт, чтобы он мог работать как скрипт bash в терминале. Я создал скрипт, который теоретически должен запустить ssh-сервер. Мне интересно, как заставить скрипт выполняться, как только я нажму на него. Я запускаю OS X 10.9.5.
не соглашаясь с другими ответами, есть общее соглашение использовать .sh расширение для сценариев оболочки - но это не полезное соглашение. Лучше вообще не использовать расширение. Преимущество быть в состоянии сказать, что foo.sh - это shell-скрипт, потому что его имя является минимальным, и вы платите за него с потерей гибкости.
чтобы сделать исполняемый файл сценария bash, он должен иметь shebang строка сверху:
и использовать the chmod +x команда, чтобы система распознала ее как исполняемый файл. Затем он должен быть установлен в одном из каталогов, перечисленных в $PATH . Если скрипт называется foo , затем вы можете выполнить его из командной строки, введя foo . Или, если он находится в текущем каталоге (общем для временных скриптов), Вы можете ввести ./foo .
ни оболочка, ни операционная система не обращают никакого внимания на расширение части имени файла. Это просто часть названия. И по не давая ему специальное расширение, вы гарантируете, что любой (пользователь или другой скрипт), который использует его, не должен заботиться о том, как он был реализован, будь то сценарий оболочки (sh, bash, csh или что-то еще), Perl, Python или awk-скрипт или двоичный исполняемый файл. Система специально разработана таким образом, что интерпретируемый скрипт или двоичный исполняемый файл могут быть вызваны, не зная и не заботясь о том, как он реализован.
UNIX-подобные системы начались с чисто текстовым интерфейсом командной строки. GUIs, такие как KDE и Gnome, были добавлены позже. В настольной системе GUI вы обычно можете запустить программу (опять же, будь то скрипт или двоичный исполняемый файл), например, дважды щелкнув значок, который ссылается на него. Как правило, это отбрасывает любые выходные данные, которые программа может распечатать, и не позволяет передавать аргументы командной строки; это гораздо менее гибко, чем запускать его из командной строки. Но для некоторых программ (в основном клиентов GUI) это может быть больше удобный.
сценарии оболочки лучше всего изучать из командной строки, а не из GUI.
(некоторые инструменты do обратите внимание на расширения файлов. Например, компиляторы обычно используют расширение для определения языка, на котором написан код: .c для C, .cpp для c++ и т. д. Это соглашение не применяется к исполняемым файлам.)
имейте в виду, что UNIX (и UNIX-подобные системы) не являются Windows. MS Windows обычно использует файл расширение, чтобы определить, как его открыть/выполнить. Двоичные исполняемые файлы должны иметь
вам не нужно расширение (или вы можете выбрать произвольный, но .sh полезная конвенции).
если вы не вводите весь путь к файлу, вы должны поместить этот файл в какой-то каталог, указанный в вашем PATH (см. environ (7) & execvp(3)), который вы можете установить постоянно в своем ~/.bashrc если ваша оболочка входа bash )
выполнения скрипта двойным щелчком (на что? ты не сказал!)- это окружение рабочего стола проблема и может быть специфичной для рабочего стола (может отличаться с Kde, Mate, Gnome. или IceWM или RatPoison). Возможно, чтение EWMH spec может помочь вам получить лучшую картину.
возможно, сделать ваш скрипт исполняемым с помощью chmod может сделать его кликабельным на вашем рабочем столе (по-видимому, кварцевые на MacOSX). Но тогда вы, вероятно, следует дать некоторая визуальная обратная связь.
и на нескольких компьютерах нет рабочего стола, включая ваш собственный, когда вы получаете к нему удаленный доступ с помощью ssh.
я не считаю, что это хорошая идея, чтобы запустить сценарий оболочки, нажав. Вероятно,вы хотите иметь возможность давать аргументы своему сценарию оболочки (и как бы вы это сделали, щелкнув?), и вы должны заботиться о его выходе. Если вы можете написать сценарий оболочки, вы можете использовать интерактивную оболочку в терминал. Что это лучший и самый естественный способ использования скрипта. Хорошие интерактивные оболочки (например,ЗШ или рыбное или, возможно, последней bash ) вкусно и настраиваемые!--53-->автодополнение услуги и вам не придется вводить много (научиться использовать tab клавиша клавиатуры). Кроме того, скрипты и программы часто являются частями составных команд (конвейеров и т. д. ).
PS. Я использую Unix с 1986 года, и Linux с 1993 года. Я никогда не запускал свои собственные программы или сценарии щелчком мыши. С чего бы это?
Я хочу, чтобы получить имя файла (без расширения) и расширение отдельно.
лучшее решение я нашел до сих пор:
это неправильно, потому что он не работает, если имя файла содержит несколько . символы. Если, скажем, у меня есть a.b.js , он будет рассматривать a и b.js , вместо a.b и js .
это можно легко сделать в Python с
но я бы предпочел не запускать Python переводчик только для этого, если возможно.
во-первых, получить имя файла без пути:
кроме того, вы можете сосредоточиться на последнем " / "пути вместо". который должен работать даже если у вас есть непредсказуемо расширениями:
дополнительные сведения см. В разделе расширение параметров оболочки в руководстве Bash.
обычно вы уже знаете расширение, поэтому вы можете использовать:
вы можете использовать магию переменных POSIX:
в этом есть оговорка, если ваше имя файла было в форме ./somefile.tar.gz затем echo $ жадно удалил бы самую длинную спичку в . и у вас будет пустая строка.
(вы можете обойти это с помощью временной переменной:
этой сайт больше объясняет.
это не работает, если файл не имеет расширения или имени файла. Вот что я использую; он использует только встроенные имена и обрабатывает больше (но не все) патологические имена файлов.
и вот некоторые тестовые примеры:
вам нужно предоставить basename с расширением, которое должно быть удалено, однако, если вы всегда выполняете tar С -z тогда вы знаете, что расширение будет .tar.gz .
это должно делать то, что вы хотите:
отлично работает, поэтому вы можете просто использовать:
команды, кстати, работают следующим образом.
команда NAME заменяет a "." символ, за которым следует любое число "." символы до конца строки, без ничего (т. е. он удаляет все из final "." до конца строки включительно). Это в основном не жадная подстановка с использованием обмана regex.
команда EXTENSION заменители a любое количество символов, за которыми следует "." символ в начале строки, без ничего (т. е. он удаляет все от начала строки до конечной точки, включительно). Это жадная подстановка, которая является действием по умолчанию.
используя Bash, есть также $ получить имя файла без расширения и $ чтобы получить расширение в одиночку. То есть,
можно использовать cut команда для удаления последних двух расширений ( ".tar.gz" часть):
как отметил Клейтон Хьюз в комментарии, это не будет работать на конкретном примере в вопросе. Поэтому в качестве альтернативы я предлагаю использовать sed с расширенными регулярными выражениями, например:
он работает, удаляя последние два (альфа-числовые) расширения безоговорочно.
[Обновлено снова после комментария от Андерса Линдаля]
нет необходимости беспокоиться с awk или sed или даже perl для этой простой задачи. Есть чистый-Баш, os.path.splitext() -совместимое решение, которое использует только разложений параметра.
разделить путь пути на пару (root, ext) такое, что root + ext == path и ext пусто или начинается с точки и содержит не более одного периода. Ведущие периоды базовое имя игнорируется; splitext('.cshrc') возвращает ('.cshrc', '') .
Актуально сейчас
Функции
Чтобы не писать длинные команды вручную можно объединить их в функции.
Например, нужно менять местами экраны с помощью xrandr это довольно длинная команда и чтобы не выполнять эту команду каждый раз после перезагрузки можно написать функцию в .bashrc
Перезайдите в терминал.
Теперь, чтобы поменять экраны местами достаточно выполнить
Ещё один пример - функция внутри обычного скрипта, она может принимать аргументы, но пока что просто возвращает hi
Изменим код так, чтобы передать имя в функцию
Подпишитесь на Telegram канал @aofeed чтобы следить за выходом новых статей и обновлением старых
I have written a bash script in a text editor, what extension do I save my script as so it can run as a bash script? I've created a script that should in theory start an ssh server. I am wondering how to make the script execute once I click on it. I am running OS X 10.9.5.
@anubhava How would i get my script to execute if i were just to double click on it and not actually type " bash myscript"
Разное
Подпишитесь на Telegram канал @aofeed чтобы следить за выходом новых статей и обновлением старых
Образование
игнорирование ведущих периодов
вот тестовые примеры для игнорирование ведущих периодов реализация, которая должна соответствовать ссылочной реализации Python на каждом входе.
вот некоторые альтернативные предложения (в основном в awk ), включая некоторые расширенные варианты использования, такие как извлечение номеров версий для пакетов программного обеспечения.
все варианты использования, используя исходный полный путь в качестве входных данных, вне зависимости от промежуточных результатов.
[Пересмотрено с однострочного до общего bash функции поведение сейчас соответствует dirname и basename служебные программы; обоснование добавил.]
на принято отвечать работает в типичный делам, а не в edge делам, а именно:
- для имен файлов без расширения (называется суффикс в остальной части этот ответ), extension=$ возвращает входное имя файла, а не пустая строка.
- extension=$ не включает начальное . , противоречит Конвенции.
- слепо знаком . не будет работать для имен без суффикса.
таким образом, сложность робастное разрешение которое покрывает все случаи края требует функции - см. его определение ниже; это может возвратить все компоненты контура.
обратите внимание, что аргументы после входного пути свободно выбираются, позиционная переменная имена.
Пропустить переменные не из проценты, которые приходят перед теми, которые есть, укажите _ (использовать выбрасываемую переменную $_ ) или '' ; например, чтобы извлечь только корень и расширение файла, используйте splitPath '/etc/bash.bashrc' _ _ fnameroot extension .Подпишитесь на Telegram канал @aofeed чтобы следить за выходом новых статей и обновлением старых
Вывод команды в переменную
Часто бывает нужно выполнить из скрипта команду и присвоить результат переменной.
Чтобы сделать это воспользуйтесь синтаксисом
ПЕРЕМЕННАЯ=$(КОМАНДА)
Например, вам нужно проанализировать лог на количество ошибок и предупреждений
wc это команда, которая подсчитывает число слов
Аргументы из командной строки
Скрипт может принимать аргументы из командной строки
Первый аргумент обозначается как $1 второй как $2 и так далее
Рассмотрим пример ar.sh
Этот скрипт ждёт один внешний аргумент и присваивает его значение переменной AR
Затем это же значение выводится три раза
В C аналогичную функцию выполняет int argc, char* argv[]
Цикл for
В самом привычном виде цикл for можно записать так
почитание ведущих периодов
Читайте также: