shell一个命令解释器,就是对于用户输入的命令进行解释后执行;
所以shell解释的命令有一定的格式;
我们在终端中输入的命令就是被shell所解释执行的...........................
所以在终端中输入的命令是有格式的!!!!!
而cd,sed,grep,vim,ls这些都是一些tools!
所以我们可以做一个shell+许多的untils,在windows下使用,这样看起来像linux的终端下执行!!!!!
shell脚本,就是shell从文件中读入命令,然后执行而已!!!
1. Linux的标准输入0,标准输出1,错误输出2.
2>&1,代表错误输出重定向到标准输出!
2. 标准输出 /dev/stdout 是指向/proc/self/fd/1 的连接,而/proc/self/fd/1又指向了/dev/pts/0
3. a='echo "HELLO"|tr A-Z a-z' ,怎么把a当做命令行来使用??
echo $a |sh 这个就可以产生hello了,把echo $a的输出作为输入进入sh中,就ok了
4. 执行脚本出现/bin/sh: Syntax error: "(" unexpected错误
只要makefile中出现 $(shell gcc -v 2>&1)就挂掉,报错为/bin/sh: -c: line 0: syntax error near unexpected token `(' ,但是ls ,pwd之类都没问题!!gcc -V也可以呀,gcc -v为啥不行呢???
7. $(DIR_OBJS)/%.o:%.c foo.h
$(CC) -o $@ -c $<
这里gcc -c 编译,居然不用指定.h头文件??也就是编译时,不用把头文件写这里,因为已经include了,哈哈
8. gcc -M和-MM列出某个.c文件所依赖的头文件! -MM不列出系统头文件,如stdio.h等
9. grep只能检索吧,sed 既可以检索,也可以编辑文件!!!!
10.
2013.3.28
所以shell解释的命令有一定的格式;
我们在终端中输入的命令就是被shell所解释执行的...........................
所以在终端中输入的命令是有格式的!!!!!
而cd,sed,grep,vim,ls这些都是一些tools!
所以我们可以做一个shell+许多的untils,在windows下使用,这样看起来像linux的终端下执行!!!!!
shell脚本,就是shell从文件中读入命令,然后执行而已!!!
1. Linux的标准输入0,标准输出1,错误输出2.
2>&1,代表错误输出重定向到标准输出!
2. 标准输出 /dev/stdout 是指向/proc/self/fd/1 的连接,而/proc/self/fd/1又指向了/dev/pts/0
3. a='echo "HELLO"|tr A-Z a-z' ,怎么把a当做命令行来使用??
echo $a |sh 这个就可以产生hello了,把echo $a的输出作为输入进入sh中,就ok了
4. 执行脚本出现/bin/sh: Syntax error: "(" unexpected错误
Dash Shell 是一个Unix Shell,比Bash Shell 小的多,符合POSIX标准。Debian曾经采用/bin/bash的更改/bin/dash,目的使用更少的磁盘空间、提供较少的功能、获取更快的速度。但是后来经过shell脚本测试存在运行问题。因为原先在bash shell 下可以运行的shell script (shell
脚本),会出现一些意想不到的问题,不是100%的兼用。
Ubuntu继承了Debian,所以从Ubuntu 6.10开始默认是Dash Shell。
解决办法:重新配置shell
1. sudo dpkg-reconfigure dash
选择NO,不使用Dash Shell。
2.采用链接指向
ln -s /bin/bash /bin/sh
检查是否正确:ls -l /bin/sh
5. 上面的那个解决方案不行呀!!
只要makefile中出现 $(shell gcc -v 2>&1)就挂掉,报错为/bin/sh: -c: line 0: syntax error near unexpected token `(' ,但是ls ,pwd之类都没问题!!gcc -V也可以呀,gcc -v为啥不行呢???
#!/usr/bin/sh
ifneq ($(CC),)
xxx=1;
endif
CC:=gcc
CC_LONGVER:=$(shell gcc -v 2>&1)
FILES:=$(shell ls)
all: main.o
# $(CC) main.o -o main
main.o:main.c
# @echo $(xxx)
echo $(CC_LONGVER)
$(CC) -c main.c -o main.o
clean:
rm main.o
rm main
必须这么写: echo "$(CC_LONGVER)", 必须双引号才行!!!
偶的神呀,怎么这个样子呀!!
当定义 xxx=1;时,echo $(xxx),打印出1
当使用echo "$(xxx)"时,打印出1; 多个冒号呀
难道函数的执行必须在command(recipes)处? 也就是通过makefile中的函数的处理函数的想要的结果a, 在recipes处使用时才去计算!!!这时make调用的shell的东西!!!!
make中的函数不是真正的函数,而是shell脚本实现的????
没办法,只能作此解释!
6. sh "gcc"时,弹出无法执行二进制文件/usr/gcc,不明白为什么!!!
这是因为sh只能执行脚本文件,当我们使用终端敲入命令时,其实sh在执行标准输入这个文件!!!
7. $(DIR_OBJS)/%.o:%.c foo.h
$(CC) -o $@ -c $<
这里gcc -c 编译,居然不用指定.h头文件??也就是编译时,不用把头文件写这里,因为已经include了,哈哈
8. gcc -M和-MM列出某个.c文件所依赖的头文件! -MM不列出系统头文件,如stdio.h等
9. grep只能检索吧,sed 既可以检索,也可以编辑文件!!!!
10.
2013.3.28