Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法从bash脚本中执行编译后的C代码?_C_Bash_Gcc - Fatal编程技术网

有没有办法从bash脚本中执行编译后的C代码?

有没有办法从bash脚本中执行编译后的C代码?,c,bash,gcc,C,Bash,Gcc,本质上,我希望从bash脚本中调用编译后的C代码。我希望能够从任何目录中调用./a.out并执行它 这一切都源于一些非常简单的事情。我制作了一个诅咒程序,它是终端的屏幕保护程序。我希望能够调用bash命令screensaver,我希望通过bash调用c代码。我希望能够从文件系统中的任何位置调用它。我在2013年的Macbook上运行,但我认为这更多的是对C的不熟悉,而不是硬件问题,如果需要,我可以提供更多细节 文件如下: /Users/User/screensaver/screensaver.c

本质上,我希望从bash脚本中调用编译后的C代码。我希望能够从任何目录中调用./a.out并执行它

这一切都源于一些非常简单的事情。我制作了一个诅咒程序,它是终端的屏幕保护程序。我希望能够调用bash命令
screensaver
,我希望通过bash调用c代码。我希望能够从文件系统中的任何位置调用它。我在2013年的Macbook上运行,但我认为这更多的是对C的不熟悉,而不是硬件问题,如果需要,我可以提供更多细节

文件如下:

/Users/User/screensaver/screensaver.c

cd/Users/User/screensaver

gcc屏幕保护程序.c
创建
a.out

然后我就可以跑了

/a.out
代码运行

我试着打电话给
/Users/User/screensaver/a.out

这不起作用,它只是说文件不存在。我尝试过使用
exec
source
,但没有任何效果。肯定有办法从别的地方叫它对吧?我知道理论上我可以将当前目录保存为一个环境变量,
cd
保存到目录中,
/a.out
,然后退出
cd
返回保存的目录中,但这似乎需要付出很大的努力才能实现它的价值

编辑:我发现理论上我可以把它放在我的
箱中
并用
-o
编译。我没有试过,但我不想这样做,因为这段代码还在开发中,所以我不想每次都编译和移动它。

这很有效:

“尝试调用/Users/User/screensaver/a.out,但不要在路径的开头添加点。当您位于保存可执行文件的目录中时,需要指定/a.out而不是a.out,这是一个特殊的安全原因。” -齐奥诺

这起作用了:

“尝试调用/Users/User/screensaver/a.out,但不要在路径的开头添加点。当您位于保存可执行文件的目录中时,需要指定/a.out而不是a.out,这是一个特殊的安全原因。”
-tshioo

您只需要在路径中放置/Users/User/screensaver,尝试调用
/Users/User/screensaver/a.out
,而不在路径的开头添加点。当您在保存可执行文件的目录中时,需要指定
/a.out
而不是
a.out
有一个特殊的安全原因。将二进制文件粘贴在路径中或使用指向它的绝对路径。为什么要从bash脚本调用它,而不是直接调用已编译的二进制文件?正如其他人所指出的,如果希望能够从任何地方调用二进制文件,则需要将其位置添加到
PATH
环境变量中,或者需要将二进制文件从
PATH
移动到现有目录中。此外,我建议将其重命名为
a.out
以外的名称。更好的是,在
/usr/local/bin
中创建一个指向
a.out
的符号链接(当然重命名为一个健全的名称),这应该是大多数发行版的默认搜索路径。(你必须检查Mac,我没有办法,但我怀疑它在那里)。您可能需要超级用户执行
ln-s/path/to/a.out/usr/local/bin/
。此外,
-o
选项只是告诉编译器将编译后的代码输出到
-o
后面的名称(而不是默认的
a.out
)。因此,
gcc-o screensaver screensaver.c
(将创建可执行的
screensaver
,而不是
a.out
)您只需将/Users/User/screensaver放在路径中,尝试调用
/Users/User/screensaver/a.out
,而不在路径的开头加一个点。当您在保存可执行文件的目录中时,需要指定
/a.out
而不是
a.out
有一个特殊的安全原因。将二进制文件粘贴在路径中或使用指向它的绝对路径。为什么要从bash脚本调用它,而不是直接调用已编译的二进制文件?正如其他人所指出的,如果希望能够从任何地方调用二进制文件,则需要将其位置添加到
PATH
环境变量中,或者需要将二进制文件从
PATH
移动到现有目录中。此外,我建议将其重命名为
a.out
以外的名称。更好的是,在
/usr/local/bin
中创建一个指向
a.out
的符号链接(当然重命名为一个健全的名称),这应该是大多数发行版的默认搜索路径。(你必须检查Mac,我没有办法,但我怀疑它在那里)。您可能需要超级用户执行
ln-s/path/to/a.out/usr/local/bin/
。此外,
-o
选项只是告诉编译器将编译后的代码输出到
-o
后面的名称(而不是默认的
a.out
)。因此
gcc-o screensaver screensaver.c
(将创建可执行的
screensaver
,而不是
a.out
PATH
环境变量告诉shell要查找要执行的程序的各个位置,如果您没有为该程序指定路径的话。因此,您可以将
/Users/User/sceensaver
添加到
路径
。或者,您可以指定路径。调用
/Users/User/screensaver/a.out
是一个完整路径,而
/a.out
表示在当前目录中运行
a.out
/Users/Users/screensaver/a.out
意味着从当前目录开始,而不是从文件系统根目录(
/
)来查找文件,这不是您在本例中想要的。@Perette那么,您是说添加到
路径而不是CALI有性能优势吗