Чи є спосіб створити скрипт і зробити його виконуваним з меншим кодом, ніж цей?


8

Мій код для створення виконавчого сценарію

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

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

2
Пов'язане в загальному вигляді: Поради щодо гольфу в Баші
Digital Trauma

Відповіді:


18

Ви можете залишити всю touchкоманду, і не потрібно її використовувати sudo. Щоб скоротити командний рядок, ви можете скористатися bashрозширенням історії, щоб вдруге зберегти ім'я файлу та пропустити зайві пробіли:

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

Розширення історії замінюється !#: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"

Вищезазначене використовує " тут рядок ", щоб надати текст на stdin, який трохи коротший, ніж його трубопровід. Аргументи echoне потрібно цитувати, якщо вони не містять символів зі спеціальним значенням.


зауважте, що єрестинг - це башизм - гередок буде переносним
Стівен Пенні

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

8

Я вважаю за краще використовувати catдля таких завдань:

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

1

Ви також можете залишити весь chmod і використовувати замість цього umask перед відлунням. Потрібно заощадити кілька байт. Шебанг необов’язковий до тих пір, поки ви не використовуєте команди, зрозумілі для кожної оболонки (в основному Bourne та C).


5
Як би ти це зробив саме?
wjandrea

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