Какая первая строка написана в сценарии оболочки? Что это значит? Если я не напишу эту строку, что произойдет? Тогда как запустить скрипт?

Это больше похоже на код -решение проблемы гольфа/фрика:

xargs -L1 -I{} echo '; {}' <./test.txt | \
      xargs -n1 | \
      uniq | \
      xargs | \
      sed -e 's/; /\n/g' -e 's/ \+/\t/g'

Но он избегает использования циклов и всех других тяжелых механизмов, которые можно увидеть в других ответах.

Он также основан на предположении, что ваши данные не содержат символ ;.

-1
12.10.2019, 12:58
2 ответа

Then how to run a script without shebang?

При поиске в виде файла (скажем, tst ), даже если он не -исполняемый:

source tst
. tst

(это бутины ->help source)

или

bash tst

аналогично

bash -c 'string of commands aka script'

Такое согласование языковых интерпретаторов и «командных потоков» также по-разному работает с perl, sed и awk.

0
28.01.2020, 05:09

Первая строка (, называемая shebang ), сообщает, какой интерпретатор следует использовать для выполнения этого файла. Ответ, отмеченный steeldriver как «Связанный», более подробно расскажет вам, что происходит.

Итак, если вы начнете с

 #!/bin/bash

bashиспользуется для интерпретации этого файла. Другими распространенными пускателями являются #!/usr/bin/perlили #!/usr/bin/python. Но это не ограничивается этим; если вы создаете файл tstс

#!/usr/bin/vi
jantje zag eens pruimen hangen
oh als eieren zo groot

, сделайте этот исполняемый файл(chmod +x tst)и запустите его (./tst), он запустит -vi для редактирования файла.

Следующая часть вопроса заключалась в том, что произойдет, если в первой строке нет шебанга. Ответ заключается в том, что будет использоваться используемый в настоящее время интерпретатор. В качестве демонстрации :создайте файл tstс:

ps -f

(никаких манипуляций, только одна строка ), сделайте этот исполняемый файл(chmod +x tst)и выполните его(./tst). Результат будет примерно таким:

ljm@phi:~$./tst
UID        PID  PPID  C STIME TTY          TIME CMD
ljm       1379  1377  0 Oct06 pts/3    00:00:00 -bash
ljm      20769  1379  0 10:34 pts/3    00:00:00 -bash
ljm      20770 20769  0 10:34 pts/3    00:00:00 ps -f

(1379 — это моя текущая оболочка, 20769 — это bash, который используется для интерпретации tst, и, следовательно, это родительский (PPID )ps)

Если я запущу shи снова выполню tst, я увижу следующее:

ljm@phi:~$ sh
$./tst   
UID        PID  PPID  C STIME TTY          TIME CMD
ljm       1379  1377  0 Oct06 pts/3    00:00:00 -bash
ljm      20773  1379  0 10:34 pts/3    00:00:00 sh
ljm      20774 20773  0 10:34 pts/3    00:00:00 /bin/sh./tst
ljm      20775 20774  0 10:34 pts/3    00:00:00 ps -f
$ 

Итак, теперь shиспользуется для интерпретации tst.

1
28.01.2020, 05:09

Теги

Похожие вопросы