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

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не нужно заключать в кавычки, если они не содержат символов со специальным значением.

deltab
источник
Обратите внимание, что 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
steeldriver
источник
1

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

GrumpyGuru
источник
5
Как бы вы это сделали?
wjandrea
Невозможно использовать umaskдля установки исполняемого бита по умолчанию ...
Ravexina