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


8

Мой код для создания исполняемого скрипта

touch script.sh && echo "echo 'Hello World'" > script.sh && sudo chmod +x script.sh

2
@ShamFiorin Я хотел бы подчеркнуть первую часть ответа десертов. Вы должны стараться использовать sudoочень экономно. Привыкание бросать его может быть опасным. В этом случае у вас есть сценарий, который вы создали, так что вы можете делать с разрешениями все, что вам угодно, без sudo.
Мари

2
Связанные в общих чертах: Советы по игре в гольф в Баше
Digital Trauma

Ответы:


18

Вы можете пропустить всю touchкоманду, и нет необходимости использовать sudo. Чтобы еще больше сократить командную строку, вы можете использовать bashHistory Expansion, чтобы сохранить имя файла во второй раз и пропустить лишние пробелы:

echo "echo 'Hello World'" >script.sh&&chmod +x !#:3

Расширение History заменяет !#:3четвертое слово из текущей командной строки, которое в вашем случае является именем файла script.sh. Конечно, это нужно адаптировать в случае, если вы измените первую команду, например:

>script.sh echo "echo 'Hello World'"&&chmod +x !#:1

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

>script.sh echo -e "#!/bin/bash\necho 'Hello World'"&&chmod +x !#:1

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

f=script.sh;>$f echo "echo 'Hello World'"&&chmod +x $f

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


20

installКоманда (часть GNU Coreutils вместе с cp, mv, rmи т.д.) можно скопировать файл , а также установить владельца и права доступа и создание родительских каталогов по мере необходимости. По умолчанию это сделает новый файл исполняемым. Он не понимает ' -', но /dev/stdinможет использоваться вместо:

install /dev/stdin script.sh <<< "echo Hello World"

В приведенном выше тексте используется строка here для предоставления текста в stdin, который немного короче, чем его передача. Аргументам echoне нужно заключать в кавычки, если они не содержат символов со специальным значением.


Обратите внимание, что Herestring является Bashism - наследник будет переносимым
Стивен Пенни

3
Хорошая идея. Вы также можете использовать замену процесса :install <(echo echo Hello World) script.sh
Цифровая травма

8

Я предпочитаю использовать catдля таких задач, как это:

cat > script.sh && chmod +x script.sh
#!/bin/sh
echo 'Hello World'Enter
Ctrl+D

1

Вы также можете опустить весь chmod и использовать вместо него umask перед эхом. Должно сэкономить вам несколько байтов. Shebang не обязателен, если вы используете команды, которые понятны каждой оболочке (в основном bourne и C).


5
Как бы вы это сделали?
wjandrea

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