Вот как я понимаю.
Вы говорите, что вы покидаете сеанс или закрываете текущий сеанс терминала.
Но вы используете tmux и все tmux для запуска программ в фоновом режиме.
Попробуйте запустить программу, поместив ее из фона. Я имею в виду
nohup myscript.sh &
nohup, чтобы запустить ваш скрипт, даже вы подписываетесь, &[and], чтобы подтолкнуть ваш сценарий к фону.
Надеюсь, это поможет вам.
Вы неправильно вызываете компилятор. Вы также должны использовать расширение файла .cc или .cpp для файлов C ++. Правильное заклинание команды компилятора там было бы, например, g++ hello-world.cpp -o hello-world.
Как объясняется в этом ответе Элиадж Каган, сообщения об ошибках, которые вы видели, произошли, потому что вы пытались выполнить свой исходный файл. Здесь я попытаюсь объяснить, почему вы получили эти конкретные сообщения.
Когда вы даете файлу выполнить этот ответ Eliah Kagan , а затем вы попытаетесь выполнить его, запустив /path/to/filename (что часто ./filename), и это текстовый файл, он будет запущен как скрипт. Сценарии обычно имеют строку shebang в качестве первой строки, состоящую из #!, за которой следует полный путь предполагаемого интерпретатора.
При попытке запустить исполняемый текстовый файл из оболочки Bash и файл не имеет строки shebang, Bash предполагает, что это скрипт оболочки и запускает новую оболочку Bash для ее запуска. (По-прежнему неплохо написать #!/bin/bash в верхней части сценария Bash, в случае, если оболочка, которая запускает его, не является Bash.) Но если файл содержит что-то иное, кроме кода Bash, тогда вы обычно получаете множество синтаксисов ошибки. Вот что случилось с вами, поскольку сообщения об ошибках, которые вы получили, указывают:
$ ./4
./4: line 1: //myfirst: No such file or directory
./4: line 4: syntax error near unexpected token `('
./4: line 4: `int main ()'
Когда оболочка пытается выполнить файл в качестве сценария оболочки, он запускает новую, не попытку выполнить это shell для интерпретации сценария. Таким образом, многие сценарии, которые могут выполняться, например, изменение каталога или определение переменных или функций, не будут иметь никакого эффекта на вызывающую оболочку. Мы можем проверить, как ведет себя неинтерактивная дочерняя оболочка, подобная той, которая пыталась запустить ваш исходный файл, отправив вход в bash с строкой shebang , например:
$ bash <<< 'echo Hello World!'
Hello World!
Просто запуск команды в текущей оболочке будет производить такой же или похожий вывод в течение некоторого времени (например, в приведенном выше случае), но мы можем более точно воспроизвести ваши сообщения об ошибках. Например:
$ bash <<<'//myfirst C++ program'
bash: line 1: //myfirst: No such file or directory
Я предположил, что строка 1 вашего исходного файла указана на основе ошибки. //, который запускает однострочный , имеет какой-либо эффект , не является комментарием в Bash. Если в первом слове команды есть /, Bash принимает это слово как путь. Если путь был к исполняемому файлу, файл будет выполнен. (Это именно то, что произошло, когда вы запустили ./4: файл, путь которого был ./4, был выполнен.) Если такого файла нет, тогда мы получим сообщение об ошибке.
// разрешает в корневой каталог /, и поскольку в вашей системе он не содержит файла с именем myfirst, вы получили это No such file or directory. Если бы он содержал соответствующий файл, у вас, вероятно, была бы другая ошибка:
$ bash <<< '/dev'
bash: line 1: /dev: Is a directory # matches, but it's a directory
$ bash <<< '/swapfile'
bash: line 1: /swapfile: Permission denied # matches, but not executable
Другой стиль комментария, который вы могли использовать в программе на C ++, /* */, мог бы создать больше интересные или хаотичные результаты, так как /* // разрешает корневой каталог / всем не скрытым файлам в корневом каталоге, а */ будет расширяться до всех не скрытых файлов которые являются каталогами в текущем каталоге.
У вас не было ошибок в строке 2 или 3. Возможно, это было из-за того, что они были пустыми, или потому, что они содержали некоторый действительный код Bash (очень маловероятный), который производил нет вывода, или у них была строка, которая начиналась с #, что является комментарием в Bash. Например, у вас может быть строка типа:
#include <iostream>
Поскольку Bash запускает команды из файла, он предполагает, что все, начиная с неуказанного #, просто для людей и игнорирует его.
Затем в строке 4 вы получили синтаксическую ошибку:
$ bash <<< 'int main()'
bash: line 1: syntax error near unexpected token `('
bash: line 1: `int main()'
( и ) являются оболочкой , начиная с неуказанного # . Они могут порождать подоболочку, в которой может выполняться команда или список команд. Обычно это интерпретатор , где вывод команды, запускаемой в подоболочке, заменяет ее во внешней оболочке. Это происходит, когда $ предшествует (stuff). Вот (полезный) пример:
$ which g++
/usr/bin/g++
$ readlink -e $(which g++)
/usr/bin/x86_64-linux-gnu-g++-7
Двойные скобки вызывают subshell :
$ bash <<< 'echo $((3+4))'
7
Другое использование () означает, что предшествующее слово - это определяемая функция, как объясняется в ответах на вопрос: Каково использование круглых скобок `()` в определении функции оболочки? Если перед командой () есть два слова перед командой function, ( будет синтаксической ошибкой:
$ bash <<< 'foo bar()'
bash: line 1: syntax error near unexpected token `('
bash: line 1: `foo bar()'
$ bash <<< 'function bar()'
bash: line 2: syntax error: unexpected end of file
function является необязательным, и мы получаем без него. Ошибка EOF, потому что мы еще не пошли . В чем заключаются скобки `()` в определении функции оболочки? .
Когда оболочка встречает синтаксическую ошибку, она будет прекратите обработку текущего ввода (и если это неинтерактивная оболочка, немедленно выйдите), чтобы вы не увидели никаких дальнейших ошибок независимо от того, что следует. Независимо от того, что ваш исходный файл продолжал говорить после int main(), оболочка не читала его.
Большое спасибо Элиа Кагану за то, что он побудил меня написать этот ответ и предоставить различные полезные сведения!
Вы неправильно вызываете компилятор. Вы также должны использовать расширение файла .cc или .cpp для файлов C ++. Правильное заклинание команды компилятора там было бы, например, g++ hello-world.cpp -o hello-world.
Как объясняется в этом ответе Элиадж Каган, сообщения об ошибках, которые вы видели, произошли, потому что вы пытались выполнить свой исходный файл. Здесь я попытаюсь объяснить, почему вы получили эти конкретные сообщения.
Когда вы даете файлу выполнить этот ответ Eliah Kagan , а затем вы попытаетесь выполнить его, запустив /path/to/filename (что часто ./filename), и это текстовый файл, он будет запускаться как скрипт. Сценарии обычно имеют строку shebang в качестве первой строки, состоящую из #!, за которой следует полный путь предполагаемого интерпретатора.
При попытке запустить исполняемый текстовый файл из оболочки Bash и файл не имеет строки shebang, Bash предполагает, что это скрипт оболочки и запускает новую оболочку Bash для ее запуска. (По-прежнему неплохо написать #!/bin/bash в верхней части сценария Bash, в случае, если оболочка, которая запускает его, не является Bash.) Но если файл содержит что-то иное, кроме кода Bash, тогда вы обычно получаете множество синтаксисов ошибки. Вот что случилось с вами, поскольку сообщения об ошибках, которые вы получили, указывают:
$ ./4
./4: line 1: //myfirst: No such file or directory
./4: line 4: syntax error near unexpected token `('
./4: line 4: `int main ()'
Когда оболочка пытается выполнить файл в качестве сценария оболочки, он запускает новую, не попытку выполнить это shell для интерпретации сценария. Таким образом, многие сценарии, которые могут выполняться, например, изменение каталога или определение переменных или функций, не будут иметь никакого эффекта на вызывающую оболочку. Мы можем проверить, как ведет себя неинтерактивная дочерняя оболочка, подобная той, которая пыталась запустить ваш исходный файл, отправив вход в bash с строкой shebang , например:
$ bash <<< 'echo Hello World!'
Hello World!
Просто запуск команды в текущей оболочке будет производить такой же или похожий вывод в течение некоторого времени (например, в приведенном выше случае), но мы можем более точно воспроизвести ваши сообщения об ошибках. Например:
$ bash <<<'//myfirst C++ program'
bash: line 1: //myfirst: No such file or directory
Я предположил, что строка 1 вашего исходного файла указана на основе ошибки. //, который запускает однострочный , имеет какой-либо эффект , не является комментарием в Bash. Если в первом слове команды есть /, Bash принимает это слово как путь. Если путь был к исполняемому файлу, файл будет выполнен. (Это именно то, что произошло, когда вы запустили ./4: файл, путь которого был ./4, был выполнен.) Если такого файла нет, тогда мы получим сообщение об ошибке.
// разрешает в корневой каталог /, и поскольку в вашей системе он не содержит файла с именем myfirst, вы получили это No such file or directory. Если бы он содержал соответствующий файл, у вас, вероятно, была бы другая ошибка:
$ bash <<< '/dev'
bash: line 1: /dev: Is a directory # matches, but it's a directory
$ bash <<< '/swapfile'
bash: line 1: /swapfile: Permission denied # matches, but not executable
Другой стиль комментария, который вы могли использовать в программе на C ++, /* */, мог бы создать больше интересные или хаотичные результаты, так как /* // разрешает корневой каталог / всем не скрытым файлам в корневом каталоге, а */ будет расширяться до всех не скрытых файлов которые являются каталогами в текущем каталоге.
У вас не было ошибок в строке 2 или 3. Возможно, это было из-за того, что они были пустыми, или потому, что они содержали некоторый действительный код Bash (очень маловероятный), который производил нет вывода, или у них была строка, начавшаяся с #, которая является комментарием в Bash. Например, у вас может быть строка типа:
#include <iostream>
Поскольку Bash запускает команды из файла, он предполагает, что все, начиная с неуказанного #, просто для людей и игнорирует его.
Затем в строке 4 вы получили синтаксическую ошибку:
$ bash <<< 'int main()'
bash: line 1: syntax error near unexpected token `('
bash: line 1: `int main()'
( и ) являются оболочкой , начиная с неуказанного # . Они могут порождать подоболочку, в которой может выполняться команда или список команд. Обычно это интерпретатор , где вывод команды, запускаемой в подоболочке, заменяет ее во внешней оболочке. Это происходит, когда $ предшествует (stuff). Вот (полезный) пример:
$ which g++
/usr/bin/g++
$ readlink -e $(which g++)
/usr/bin/x86_64-linux-gnu-g++-7
Двойные скобки вызывают subshell :
$ bash <<< 'echo $((3+4))'
7
Другое использование () означает, что предшествующее слово - это определяемая функция, как объясняется в ответах на вопрос: Каково использование круглых скобок `()` в определении функции оболочки? Если перед командой () есть два слова перед командой function, ( будет синтаксической ошибкой:
$ bash <<< 'foo bar()'
bash: line 1: syntax error near unexpected token `('
bash: line 1: `foo bar()'
$ bash <<< 'function bar()'
bash: line 2: syntax error: unexpected end of file
function является необязательным, и мы получаем без него. Ошибка EOF, потому что мы еще не пошли . В чем заключаются скобки `()` в определении функции оболочки? .
Когда оболочка встречает синтаксическую ошибку, она будет прекратите обработку текущего ввода (и если это неинтерактивная оболочка, немедленно выйдите), чтобы вы не увидели никаких дальнейших ошибок независимо от того, что следует. Независимо от того, что ваш исходный файл продолжал говорить после int main(), оболочка не читала его.
Большое спасибо Элиа Кагану за то, что он побудил меня написать этот ответ и предоставить различные полезные сведения!