Czy istnieje sposób na utworzenie skryptu i uczynienie go wykonywalnym przy użyciu mniejszego kodu niż ten?

8

Mój kod do stworzenia skryptu wykonywalnego

touch script.sh && echo "echo 'Hello World'" > script.sh && sudo chmod +x script.sh
Sham Fiorin
źródło
2
@ShamFiorin Chciałem podkreślić pierwszą część odpowiedzi na desery. Powinieneś próbować używać sudobardzo oszczędnie. Przyzwyczajenie się do rzucania nim może być niebezpieczne. W tym przypadku jesteś właścicielem skryptu, który utworzyłeś, dzięki czemu możesz robić, co chcesz, z uprawnieniami, bez sudo.
Marie
2
Powiązane ogólnie: Porady dotyczące gry w golfa w Bash
Cyfrowa trauma

Odpowiedzi:

18

Możesz pominąć całą touchkomendę i nie musisz jej używać sudo. Aby jeszcze bardziej skrócić linię poleceń, możesz użyć bashrozszerzenia historii, aby zapisać nazwę pliku po raz drugi i pominąć niepotrzebne spacje:

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

Rozszerzenie historii zastępuje !#:3się czwartym słowem z bieżącego wiersza poleceń, którym w Twoim przypadku jest nazwa pliku script.sh. Oczywiście należy to dostosować w przypadku modyfikacji pierwszego polecenia, np .:

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

Zauważ, że poprawny skrypt wymaga shebang :

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

Jeśli potrzebujesz częściej tego łańcucha poleceń, polecam zdefiniowanie funkcji , w ten sposób wystarczy wpisać nazwę funkcji. Podobnie adaptowalnym - choć dłuższym - sposobem jest użycie zmiennej przechowującej nazwę pliku:

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

Jeśli twoja nazwa pliku zawiera znaki specjalne, nie zapomnij podać ich poprawnie .

deser
źródło
20

installKomenda (część GNU Coreutils wraz z cp, mv, rm, itd.) Można kopiować jednocześnie ustawienie jego własności i uprawnień oraz tworzenia katalogów nadrzędnych jako niezbędny plik. Domyślnie nowy plik będzie wykonywalny. Nie rozumie „ -”, ale /dev/stdinzamiast tego można go użyć:

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

W powyższym użyto ciągu „ tutaj ”, aby podać tekst na stdin, który jest nieco krótszy niż wstawienie go. Argumenty, echoktóre nie wymagają cytowania, chyba że zawierają znaki o specjalnym znaczeniu.

deltab
źródło
zwróć uwagę, że herestring to bashizm - heredok byłby przenośny
Steven Penny
3
Dobry pomysł. Możesz także użyć substytucji procesu :install <(echo echo Hello World) script.sh
Cyfrowa trauma
8

Wolę używać catdo takich zadań:

cat > script.sh && chmod +x script.sh
#!/bin/sh
echo 'Hello World'Enter
Ctrl+D
steeldriver
źródło
1

Możesz także pominąć cały chmod i zamiast tego użyć echa umask przed echem. Powinieneś zaoszczędzić kilka bajtów. Shebang jest opcjonalny, o ile korzystasz z poleceń zrozumiałych dla każdej powłoki (głównie bourne i C).

GrumpyGuru
źródło
5
Jak byś to dokładnie zrobił?
wjandrea
umaskDomyślnie nie można używać do ustawiania bitu wykonywalnego ...
Ravexina,