关于linux下的文件扩展名的问题

看到鸟哥的私房菜里说道,linux文件能不能被执行完全看10属性,与文件名一点关系都没有,在windows下能被执行的文件扩展名通常.com .exe .bat等,而在linux下,只要权限中有x的话,就代表这个文件能被执行。
以上是鸟哥的原话,现在我的疑问出现了,我用vi 编辑了一个名字为 test文件 和一个名字为test.c的文件,这两个文件的内容完全一样,是一个最基本的程序:
#include<stdio.h>
main()
{
printf("hello,linux!\n");
}
在用gcc编译两个文件时出现不同了,在编译test.c时,一切正常,但是在编译test 时却发生了问题,不能编译,具体如下:
[root@localhost lili]# gcc test -o test.out
test: file not recognized: File format not recognized
collect2: ld 返回 1
前辈大神们,不是说文件与扩展名没有关系吗?两个文件第权限是完全一致的!如图:
[root@localhost lili]# ll test*
-rw-r--r--. 1 root root 55 11月 5 23:29 test
-rw-r--r--. 1 root root 55 11月 5 23:07 test.c
为什么少了扩展名就不能进行编译了啊?问题在哪里?

第1个回答  2011-11-06
windows操作系统根据文件的扩展名来区分文件类型,而Linux系统不是,Linux通过查看文件内的头部信息来确定文件的类型,而与文件的名字无关。使用gcc 编译test时出现错误,不是操作系统的原因,代码文件命名为text与text.c,对于操作系统来说,它们都是text文件,没有什么区别,但对于编译程序gcc来说就不同了,gcc编译器程序是根据文件的扩展名来判断文件类型的,所以使用gcc test -o test.out命令出现的错误不是操作系统的原因,而是gcc的原因,gcc程序的输入文件一般扩展名为.c .cpp .o .asm .S .s等,具体见gcc帮助文档。本回答被提问者采纳
第2个回答  2015-09-23
Linux环境下一个文件是否能被执行,和后缀名没有太大的关系,主要看文件的属性有关。但是了解一下Linux文件的后缀名还是有必要的,特别是创建一些文件,最好还是加后缀名,这样做的目的是仅仅是为了在应用时方便。
在Linux中,带有扩展名的文件,只能代表程序的关联,并不能说明文件是可以执行,从这方面来说,Linux的扩展名没有太大的意义。
Linux文件类型和Linux文件的文件名所代表的意义是两个不同的概念。通过一般应用程序而创建的比如file.txt、file.tar.gz ,这些文件虽然要用不同的程序来打开,但放在Linux文件类型中衡量的话,大多是常规文件(也被称为普通文件)。
Linux文件类型常见的有:普通文件、目录、字符设备文件、块设备文件、符号链接文件等。
2.1 普通文件;
[root@localhost ~]# ls -lh install.log
-rw-r--r-- 1 root root 53K 03-16 08:54 install.log
用 ls -lh 来查看某个文件的属性,可以看到有类似 -rw-r--r-- ,值得注意的是第一个符号是 - ,这样的文件在Linux中就是普通文件。这些文件一般是用一些相关的应用程序创建,比如图像工具、文档工具、归档工具... .... 或
cp工具等。这类文件的删除方式是用rm 命令。
2.2 目录
[root@localhost ~]# ls -lh
总计 14M
-rw-r--r-- 1 root root 2 03-27 02:00 fonts.scale
-rw-r--r-- 1 root root 53K 03-16 08:54 install.log
-rw-r--r-- 1 root root 14M 03-16 07:53 kernel-2.6.15-1.2025_FC5.i686.rpm
drwxr-xr-x 2 1000 users 4.0K 04-04 23:30 mkuml-2004.07.17
drwxr-xr-x 2 root root 4.0K 04-19 10:53 mydir
drwxr-xr-x 2 root root 4.0K 03-17 04:25 Public
当在某个目录下执行,看到有类似 drwxr-xr-x
,这样的文件就是目录,目录在Linux是一个比较特殊的文件。注意它的第一个字符是d。创建目录的命令可以用 mkdir
命令,或cp命令,cp可以把一个目录复制为另一个目录。删除用rm 或rmdir命令。
2.3 字符设备或块设备文件;
进入/dev目录,列一下文件,会看到类似如下的;
[root@localhost ~]# ls -la /dev/tty
crw-rw-rw- 1 root tty 5, 0 04-19 08:29 /dev/tty
[root@localhost ~]# ls -la /dev/hda1
brw-r----- 1 root disk 3, 1 2006-04-19 /dev/hda1
/dev/tty的属性是 crw-rw-rw- ,注意前面第一个字符是 c ,这表示字符设备文件。比如猫等串口设备;
/dev/hda1 的属性是 brw-r----- ,注意前面的第一个字符是b,这表示块设备,比如硬盘,光驱等设备;
这个种类的文件,是用mknode来创建,用rm来删除。目前在最新的Linux发行版本中,一般不用创建设备文件。因为这些文件是和内核相关联的。
2.4 套接口文件;
当启动MySQL服务器时,会产生一个mysql.sock的文件。
[root@localhost ~]# ls -lh /var/lib/mysql/mysql.sock
srwxrwxrwx 1 mysql mysql 0 04-19 11:12 /var/lib/mysql/mysql.sock
注意这个文件的属性的第一个字符是 s。了解一下就行了。
2.5 符号链接文件;
[root@localhost ~]# ls -lh setup.log
lrwxrwxrwx 1 root root 11 04-19 11:18 setup.log -> install.log
当查看文件属性时,会看到有类似 lrwxrwxrwx,注意第一个字符是l,这类文件是链接文件。是通过ln -s
源文件名新文件名。上面是一个例子,表示setup.log是install.log的软链接文件。这和Windows操作系统中的快捷方式
有点相似。
符号链接文件的创建方法举例;
[root@localhost ~]# ls -lh kernel-2.6.15-1.2025_FC5.i686.rpm
-rw-r--r-- 1 root root 14M 03-16 07:53 kernel-2.6.15-1.2025_FC5.i686.rpm
[root@localhost ~]# ln -s kernel-2.6.15-1.2025_FC5.i686.rpm kernel.rpm
[root@localhost ~]# ls -lh kernel*
-rw-r--r-- 1 root root 14M 03-16 07:53 kernel-2.6.15-1.2025_FC5.i686.rpm
lrwxrwxrwx 1 root root 33 04-19 11:27 kernel.rpm -> kernel-2.6.15-1.2025_FC5.i686.rpm
第3个回答  2011-11-06
你在想什么????
gcc 编译的是c源码码,test没后缀。gcc不认
怎么扯到文件是不是可执行的上面上去了追问

呵呵,我还是菜鸟,gcc编译的过程不是对源码的一种翻译嘛,我以为这也是一种对源码的执行操作呢……就是说编译的时候必须要有后缀的,没有后缀就认不出来是吗?那linux下的文件都什么情况下必须要加上后缀?谢谢!哦,对了,那我是不是可以这么理解,其实linux文件下的扩展名只有在能否执行的问题时是可有可无的,其他情况下文件的扩展名还是在起作用的,对吗?唉……,linux的文件扩展名到底都有啥作用啊,迷糊了……

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网