Это больше похоже на код -решение проблемы гольфа/фрика:
xargs -L1 -I{} echo '; {}' <./test.txt | \
xargs -n1 | \
uniq | \
xargs | \
sed -e 's/; /\n/g' -e 's/ \+/\t/g'
Но он избегает использования циклов и всех других тяжелых механизмов, которые можно увидеть в других ответах.
Он также основан на предположении, что ваши данные не содержат символ ;
.
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.
Первая строка (, называемая 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
.