精华内容
下载资源
问答
  • Linux中命令选项及参数简介

    千次阅读 2018-01-15 19:45:33
    登录Linux后,我们就可以在#或$符后面去输入命令,有的时候命令后面还会跟着“选项”(英文options)或“参数”(英文arguments)。即Linux中命令格式为: command [options] [arguments] //中括号代表是可选的,...

    登录Linux后,我们就可以在#或$符后面去输入命令,有的时候命令后面还会跟着“选项”(英文options)或“参数”(英文arguments)。即Linux中命令格式为:

    command [options] [arguments] //中括号代表是可选的,即有些命令不需要选项也不需要参数,但有的命令在运行时需要多个选项或参数。

    选项options:

    选项是调整命令执行行为的开关,即,选项不同决定了命令的显示结果不同。

    选项分为长选项和短选项。

    短选项:比如-h,-l,-s等。(-   后面接单个字母)

      l短选项都是使用‘-’引导,当有多个短选项时,各选项之间使用空格隔开。

      l有些命令的短选项可以组合,比如-l –h 可以组合为–lh

      l有些命令的短选项可以不带-,这通常叫作BSD风格的选项,比如ps aux

      l有些短选项需要带选项本身的参数,比如-L 512M

    长选项:比如--help,--list等。(--  后面接单词)

      l长选面都是完整的单词

      l长选项通常不能组合

      l如果需要参数,长选项的参数通常需要‘=’,比如--size=1G

    参数arguments:

      参数是指命令的作用对象。

      如ls命令,不加参数的时候显示是当前目录,也可以加参数,如ls /dev, 则输出结果是/dev目录。

      以上简要说明了选项及参数的区别,但具体Linux中哪条命令有哪些选项及参数,需要我们靠经验积累或者查看Linux的帮助了。

     

    总结:

      选项是限定结果的显示结果  

        短选项(-  一个横杠):只能修饰一个字符的选项,比如: ls -a,当然多个短选项可以合并,比如tar -cvf

        长选项(--  两个横杠):可以修饰单个字符,也可以修饰一个单词,比如:(1) chkconfig --list   (2)chkconfig --add xxx  (3)service --status-all

      参数是传递到脚本中的真实的参数

     

     

    第二种理解:

    本文介绍了linux shell中使用命令行选项与命令行参数的方法,在bash中,可以用以下三种方式来处理命令

    行参数,每种方式都有自己的应用场景
    问题描述:在linux shell中如何处理tail -n 10 access.log这样的命令行选项?
    在bash中,可以用以下三种方式来处理命令行参数,每种方式都有自己的应用场景。
    1,直接处理,依次对$1,$2,...,$n进行解析,分别手工处理;
    2,getopts来处理,单个字符选项的情况(如:-n 10 -f file.txt等选项);
    3,getopt,可以处理单个字符选项,也可以处理长选项long-option(如:--prefix=/home等)。
    总结:小脚本手工处理即可,getopts能处理绝大多数的情况,getopt较复杂、功能也更强大。
    1,直接手工处理位置参数
    必须要要知道几个变量,
    代码如下:

    *    $0 :即命令本身,相当于c/c++中的argv[0]  
    *    $1 :第一个参数.  
    *    $2, $3, $4 ... :第2、3、4个参数,依次类推。  
    *    $#  参数的个数,不包括命令本身  
    *    $@ :参数本身的列表,也不包括命令本身  
    *    $* :和$@相同,但"$*""$@"(加引号)并不同,"$*"将所有的参数解释成一个字符串,而"$@"  

     

    是一个参数数组。


    手工处理方式能满足多数的简单需求,配合shift使用也能构造出强大的功能,但处理复杂选项时建议用下面

    的两种方法。
    例子,(getargs.sh):
    代码如下:

    复制代码
    #!/bin/bash  
    if [ $# -lt 1 ]; then  
        echo "error.. need args"  
        exit 1  
    fi  
    echo "commond is $0"  
    echo "args are:"  
    for arg in "$@"  
    do  
        echo $arg  
    done  
    复制代码

     

     

     



    运行命令:
    代码如下:


     
    ./getargs.sh 11 22 cc  
    commond is ./getargs.sh  
    args are:  
    11  
    22  
    cc  

     



    2,getopts (shell内置命令)
    处理命令行参数是一个相似而又复杂的事情,为此,c提供了getopt/getopt_long等函数,c++的boost提供了

    options库,在shell中,处理此事的是getopts和getopt。
    getopts/getopt的区别,getopt是个外部binary文件,而getopts是shell builtin。

    代码如下:

    [root@jbxue ~]$ type getopt  
    getopt is /usr/bin/getopt  
    [root@jbxue ~]$ type getopts  
    getopts is a shell builtin  

     

     

    getopts不能直接处理长的选项(如:--prefix=/home等)
    关于getopts的使用方法,可以man bash  搜索getopts
    getopts有两个参数,第一个参数是一个字符串,包括字符和“:”,每一个字符都是一个有效的选项,如果

    字符后面带有“:”,表示这个字符有自己的参数。getopts从命令中获取这些参数,并且删去了“-”,并

    将其赋值在第二个参数中,如果带有自己参数,这个参数赋值在“optarg”中。提供getopts的shell内置了

    optarg这个变变,getopts修改了这个变量。
    这里变量$optarg存储相应选项的参数,而$optind总是存储原始$*中下一个要处理的元素位置。
    while getopts ":a:bc" opt  #第一个冒号表示忽略错误;字符后面的冒号表示该选项必须有自己的参数
    例子,(getopts.sh):

    代码如下:

    复制代码
    echo $*  
    while getopts ":a:bc" opt  
    do  
            case $opt in  
                    a ) echo $optarg  
                        echo $optind;;  
                    b ) echo "b $optind";;  
                    c ) echo "c $optind";;  
                    ? ) echo "error"  
                        exit 1;;  
            esac  
    done  
    echo $optind  
    shift $(($optind - 1))  
    #通过shift $(($optind - 1))的处理,$*中就只保留了除去选项内容的参数,可以在其后进行正常的shell  
      
    编程处理了。  
    echo $0  
    echo $*  
    复制代码

     


     

     





    执行命令:

    复制代码 代码如下:

     

    复制代码
    ./getopts.sh -a 11 -b -c  
    -a 11 -b -c  
    11  
    3  
    b 4  
    c 5  
    5  
    ./getopts.sh  
    复制代码

     

     


     

    3,getopt(一个外部工具)
    具体用用法可以 man getopt
    #-o表示短选项,两个冒号表示该选项有一个可选参数,可选参数必须紧贴选项,如-carg 而不能是-c arg
    #--long表示长选项
    例子,(getopt.sh):

    代码如下:

    复制代码
    #!/bin/bash  
    # a small example program for using the new getopt(1) program.  
    # this program will only work with bash(1)  
    # an similar program using the tcsh(1) script. language can be found  
    # as parse.tcsh  
    # example input and output (from the bash prompt):  
    # ./parse.bash -a par1 'another arg' --c-long 'wow!*\?' -cmore -b " very long "  
    # option a  
    # option c, no argument  
    # option c, argument `more'  
    # option b, argument ` very long '  
    # remaining arguments:  
    # --> `par1'  
    # --> `another arg'  
    # --> `wow!*\?'  
    # note that we use `"$@"' to let each command-line parameter expand to a  
    # separate word. the quotes around `$@' are essential!  
    # we need temp as the `eval set --' would nuke the return value of getopt.  
    #-o表示短选项,两个冒号表示该选项有一个可选参数,可选参数必须紧贴选项  
    #如-carg 而不能是-c arg  
    #--long表示长选项  
    #"$@"在上面解释过  
    # -n:出错时的信息  
    # -- :举一个例子比较好理解:  
    #我们要创建一个名字为 "-f"的目录你会怎么办?  
    # mkdir -f #不成功,因为-f会被mkdir当作选项来解析,这时就可以使用  
    # mkdir -- -f 这样-f就不会被作为选项。  
    temp=`getopt -o ab:c:: --long a-long,b-long:,c-long:: \  
         -n 'example.bash' -- "$@"`  
    if [ $? != 0 ] ; then echo "terminating..." >&2 ; exit 1 ; fi  
    # note the quotes around `$temp': they are essential!  
    #set 会重新排列参数的顺序,也就是改变$1,$2...$n的值,这些值在getopt中重新排列过了  
    eval set -- "$temp"  
    #经过getopt的处理,下面处理具体选项。  
    while true ; do  
            case "$1" in  
                    -a|--a-long) echo "option a" ; shift ;;  
                    -b|--b-long) echo "option b, argument \`$2'" ; shift 2 ;;  
                    -c|--c-long)  
                            # c has an optional argument. as we are in quoted mode,  
                            # an empty parameter will be generated if its optional  
                            # argument is not found.  
                            case "$2" in  
                                    "") echo "option c, no argument"; shift 2 ;;  
                                    *)  echo "option c, argument \`$2'" ; shift 2 ;;  
                            esac ;;  
                    --) shift ; break ;;  
                    *) echo "internal error!" ; exit 1 ;;  
            esac  
    done  
    echo "remaining arguments:"  
    for arg do  
       echo '--> '"\`$arg'" ;  
    done  
    复制代码

     

     

     



    运行命令:
    代码如下:

    1
    2
    3
    4
    5
    6
    ./getopt.sh --b-long abc -a -c33 remain 
    option b, argument `abc' 
    option a 
    option c, argument `33' 
    remaining arguments: 
    --> `remain'

      

     

     

    转载自:https://www.cnblogs.com/qlqwjy/p/7787156.html

    展开全文
  • http://blog.csdn.net/yuast1234/archive/2010/06/22/5686871.aspx使用内置的setshopt命令设置bash选项 set命令可以用来定制shell环境,使用选项“o”来打开或者关闭选项。例如打开选项:set -o 选项,关闭选项目...

     

    http://blog.csdn.net/yuast1234/archive/2010/06/22/5686871.aspx
    使用内置的set和shopt命令设置bash选项
    
    

        set命令可以用来定制shell环境,使用选项“o”来打开或者关闭选项。例如打开选项:set -o 选项,关闭选项目:set +o 选项。

        例如要打开vi交互式命令行编辑,则如下:

    [root@localhost ~]# set -o    #查看当前设置情况
    allexport       off
    braceexpand     on
    emacs           on
    errexit         off
    errtrace        off
    functrace       off
    hashall         on
    histexpand      on
    history         on
    ignoreeof       off
    interactive-comments    on
    keyword         off
    monitor         on
    noclobber       off
    noexec          off
    noglob          off
    nolog           off
    notify          off
    nounset         off
    onecmd          off
    physical        off
    pipefail        off
    posix           off
    privileged      off
    verbose         off
    vi              off              #关闭中
    xtrace          off
    [root@localhost ~]# set -o vi    #把vi选项打开
    [root@localhost ~]# set -o       #查看当前设置情况
    allexport       off
    braceexpand     on
    emacs           off
    errexit         off
    errtrace        off
    functrace       off
    hashall         on
    histexpand      on
    history         on
    ignoreeof       off
    interactive-comments    on
    keyword         off
    monitor         on
    noclobber       off
    noexec          off
    noglob          off
    nolog           off
    notify          off
    nounset         off
    onecmd          off
    physical        off
    pipefail        off
    posix           off
    privileged      off
    verbose         off
    vi              on                 #已经打开
    xtrace          off

        内置set命令选项

    选项名 快捷开关 含义
    allexport -a 从这个选项中被设置开始就自动标明要输出的新变量或修改过的变量,直至选项被复位
    braceexpand -B 打开花括号扩展,它是一个默认设置
    emacs   使用emacs内置编辑器进行命令行编辑,是一个默认设置
    errexit -e 当命令返回一个非零退出状态(失败)时退出。读取初始化文件时不设置
    histexpand -H 执行历史替换时打开!和!!扩展,是一个默认设置
    history   打开命令行历史、默认为打开
    ignoreeof   禁止用EOF(Ctrl+D)键退出shell。必须键入exit才能退出。等价于设置shell变量IGNOREEOF=10
    keyword -k 将关键字参数放到命令的环境中
    interactive-comments   对于交互式shell,把#符后面的文本作为注释
    monitor -m 设置作业控制
    noclobber -C 防止文件在重定向时被重写
    noexec -n 读命令,但不执行。用来检查脚本的语法。交互式运行时不开启
    noglob -d 禁止用路径名扩展。即关闭通配符
    notify -b 后台作业完成时通知用户
    nounset -u 扩展一个未设置的变量时显示一个错误信息
    onecmd -t 在读取和执行命令后退出
    physical -P 设置时,在键入cd或pwd禁止符号链接。用物理目录代替
    privileged -p 设置后,shell不读取.profile或ENV文件,且不从环境继承shell函数,将自动为setuid脚本开启特权
    verbose -v 为调试打开verbose模式
    vi   使用vi内置编辑器进行命令行编辑
    xtrace -x 为调试打开echo模式
         

        shopt命令是set命令的一种替代,很多方面都和set命令一样,但它增加了很多选项。可有使用“-p”选项来查看shopt选项的设置。“-u”开关表示一个复位的选项,“-s”表示选项当前被设置。

    [root@localhost ~]# shopt -p     #查看当前设置情况
    shopt -u cdable_vars
    shopt -u cdspell
    shopt -u checkhash
    shopt -s checkwinsize
    shopt -s cmdhist
    shopt -u dotglob
    shopt -u execfail
    shopt -s expand_aliases
    shopt -u extdebug
    shopt -u extglob
    shopt -s extquote
    shopt -u failglob
    shopt -s force_fignore
    shopt -u gnu_errfmt
    shopt -u histreedit
    shopt -u histappend
    shopt -u histverify
    shopt -s hostcomplete
    shopt -u huponexit
    shopt -s interactive_comments
    shopt -u lithist
    shopt -s login_shell
    shopt -u mailwarn
    shopt -u no_empty_cmd_completion
    shopt -u nocaseglob
    shopt -u nullglob
    shopt -s progcomp
    shopt -s promptvars
    shopt -u restricted_shell
    shopt -u shift_verbose
    shopt -s sourcepath
    shopt -u xpg_echo

    [root@localhost ~]# shopt -s cdspell    #把cdspell选项打开
    [root@localhost ~]# shopt -p cdspell     #打印cdspell设置
    shopt -s cdspell
    [root@localhost ~]# cd /raot             #故意拼写错误
    /root
    [root@localhost ~]# pwd                  #查看当前目录
    /root
    [root@localhost ~]# cd /usr/loca/bin    #故意拼写错误
    /usr/local/bin
    [root@localhost bin]# pwd                #查看当前目录   
    /usr/local/bin
    [root@localhost bin]# shopt -u cdspell  #把cdspell选项打开
    [root@localhost bin]# shopt -p cdspell  #打印cdspell设置
    shopt -u cdspell
    [root@localhost bin]# cd /raot          #故意拼写错误
    -bash: cd: /raot: 没有那个文件或目录     #进入目录错误

    shopt命令选项

    选项 含义 cdable_vars 如果给cd内置命令的参数不是一个目录,就假设它是一个变量名,变量的值是将要转换到的目录 cdspell 纠正cd命令中目录名的较小拼写错误。检查的错误包括颠倒顺序的字符,遗漏的字符以及重复的字符。如果知道一处修改,正确的路径就打印出,命令将继续。只用于交互式shell checkhash bash在试图执行一个命令前,先在哈希表中寻找,以确定命令是否存在。如果命令不存在,就执行正常路径搜索 checkwinsize bash在每个命令后检查窗口大小,如果有必要,就更新LINES和COLUMNS的值 cmdhist bash试图将一个多行命令的所有行保存在同一个历史项中。这使得多行命令的重新编辑更方便 dotglob bash在文件名扩展的结果中包括以点(.)开头的文件名 execfail 如果一个交互式shell不能执行指定给exec内置命令作为参数的文件,它不会退出。如果exec失败,一个交互式shell不会退出 expand_aliases 别名被扩展。默认为打开 extglob 打开扩展的模式匹配特征(正常的表达式元字符来自Korn shell的文件名扩展) histappend 当shell退出时,历史清单将添加到以HISTFILE变量的值命名的文件中,而不是覆盖文件 histreedit 如果readline正被使用,用户有机会重新编辑一个失败的历史替换 histverify 如果设置,且readline正被使用,历史替换的结果不会立即传递给shell解析器。而是将结果行装入readline编辑缓冲区中,允许进一步修改 hostcomplete 如果设置,且readine正被使用,当正在完成一个包含@的词时bash将试图执行主机名补全。默认为打开 huponexit 如果设置,当一个交互式登陆shell退出时,bash将发送一个SIGHUP(挂起信号)给所有的作业 interactive_comments 在一个交互式shell中,允许以#开头的词以及同一行中其他的字符被忽略。默认为打开 lithist 如果打开,且cmdhist选项也打开,多行命令将用嵌入的换行符保存到历史中,而无需在可能的地方用分号来分隔 mailwarn 如果设置,且bash用来检查邮件的文件自从上次检查后已经被访问,将显示消息“The mail in mailfile has been read” nocaseglob 如果设置,当执行文件名扩展时,bash在不区分大小写的方式下匹配文件名 nullglob 如果设置,bash允许没有匹配任何文件的文件名模式扩展成一个空串,而不是它们本身 promptvars 如果设置,提示串在被扩展后再经历变量和参量扩展。默认为打开 restricted_shell 如果shell在受限模式下启动就设置这个选项。该值不能被改变。当执行启动文件时,不能复位该选项,允许启动文件发现shell是否是受限的 sourcepath 如果设置,source内置命令使用PATH的值来寻找包含作为参数提供的文件的目录。默认为打开 source 点(.)的同义词 shift_verbose 如果该选项设置,当移动计数超过位置参量个数时,shift内置命令将打印一个错误消息
    展开全文
  • Shell脚本:命令选项参数处理

    千次阅读 2017-09-17 10:43:58
    Shell脚本:命令选项参数处理 Shell脚本的参数处理主要分三种情况,下面我们一一演示说明。 1、不带选项的参数处理 首先,我们通过一个不带选项的参数处理脚本,让大家了解一下shell脚本的常用内置参数。 #!/bin...
    

    Shell脚本:命令选项参数处理

    Shell脚本的参数处理主要分三种情况,下面我们一一演示说明。

    1、不带选项的参数处理

    首先,我们通过一个不带选项的参数处理脚本,让大家了解一下Shell脚本的常用内置参数。

    #!/bin/bash

     

    echo $0    # 脚本名, 带执行时的路径,类似于C语言中的argv[0]

    echo $1    # 参数1

    echo $2    # 参数2

    echo $3    # 参数3, 以此类推

    echo $#    # 参数个数, 不包含脚本本身

    echo $@    # 参数列表

    echo $*     # $*$@相同, "$*""$@"不同, "$*"将所有参数解释为一个字符串, "$@"是一个参数数组.


    把上面这段脚本保存到arg.sh中,然后执行脚本将显示这些Shell内置参数值

    [root@HLZ arg_proc]# dos2unix *.sh     # 语系转换为类unix方格

    dos2unix:converting file arg.sh to UNIX format ...

    [root@HLZ arg_proc]# ./arg.sh z yy zzz jkl

    ./arg.sh

    z

    yy

    zzz

    4

    z yy zzz jkl

    z yy zzz jkl

    显然地,不带选项的参数处理可以满足固定参数的脚本编写需求,但是对于可变参数或者复杂参数情况,就需要脚本中带选项的参数处理方式了!


    2、短选项参数处理

    Shell脚本中短选项参数的处理,完全可以使用while…shift…语句实现。当然,此处为了简化步骤,我们借助bash的内置命令getopts实现。

    #!/bin/bash

     

    # 选项后面不带:表示无参数, :表示有参数

    while getopts "ab:" arg

    do

            case $arg in

                      a)

                               echo "Optiona";;

                      b)

                               echo "Option b: ${OPTARG}";;

            esac

    done

     

    shift $((OPTIND-1))  #执行该语句,以便本脚本后面固定参数序号从$1开始.

    echo "Process arg: $1"

    echo "Process arg: $2"

    将上面这段脚本保存到getopts.sh中,然后执行:

    [root@HLZ arg_proc]# dos2unix *.sh

    dos2unix:converting file getopts.sh to UNIX format ...

    [root@HLZ arg_proc]# ./getopts.sh -b xyz -a arg1 arg2    #2.1

    Optionb: xyz

    Option a

    Process arg: arg1

    Process arg: arg2

    [root@HLZ arg_proc]# ./getopts.sh -b xyz -a -c arg1 arg2   #2.2

    Optionb: xyz

    Optiona

    ./getopts.sh: illegal option -- c  #对于不支持的选项,由getopts报错.

    Processarg: arg1

    Processarg: arg2

    [root@HLZ arg_proc]#./getopts.sh -b -a xyz arg1 arg2   #2.3

    Option b: -a

    Process arg: xyz

    Process arg: arg1

    如例2.3所示,对于不支持的选项,getopts会报错,但不退出而是继续执行。

    执行脚本时,对选项参数是没有顺序要求的,但是如例2.3所示,-b选项实现时是要求带参数的,但是执行时没有带参数,导致getopts把后面的-a解析为参数了,而且解析不到-a选项了!!这是由于执行时参数输入错误导致的,当然为了增强脚本的鲁棒性,可以对选项-b的参数进一步做个判断:若参数是本脚本的另一个选项,则报错退出。

    带短选项参数的处理方式基本能够满足shell脚本的写作需求。

    当然为了脚本选项参数的意义更加简明易懂,我们接下来继续介绍长选项参数的处理方法。


    3、长选项参数处理

    Shell脚本长短选项参数的处理,使用getoptwhile…shift…语句实现。

    #!/bin/bash

     

    # -o--options, 后面接短选项;  -l--long, 后面接长选项;

    # 多个长选项之间用,分隔, 类似于短选项, 选项后面不带:表示无参数, 1:表示有参数, 而带2::表示参数可有可无.

    ARGS=`getopt -o xy:z:: -l xlong,ylong:,zlong:: -n 'getopt.sh' -- "$@"`

    if [ $? != 0 ]; then

            exit 1

    fi

     

    eval set -- "${ARGS}"    # 将规范化的参数分配至位置参数($1,$2,...)

     

    while true

    do

            case $1 in

                      -x|--xlong)

                               echo "Option x"; shift;;

                      -y|--ylong)

                               echo "Option y: $2"; shift 2;;

                      -z|--zlong)

                               case $2 in

                                        "")

                                                  echo "Option z: no argument"; shift;;

                                        *)

                                                  echo "Option z: $2"; shift 2;;

                               esac;;

                      --)

                               shift; break;;

            esac

    done

     

    # 处理剩余参数

    for arg in $@

    do

            echo "Process $arg"

    done

    将上面这段脚本保存到getopt.sh中,然后执行:

    [root@HLZ arg_proc]# dos2unix *.sh

    dos2unix:converting file getopt.sh to UNIX format ...

    [root@HLZ arg_proc]# ./getopt.sh -x -y 123 -z456 arg1 arg2   #3.1

    Option x

    Option y: 123

    Option z: 456

    Process arg1

    Process arg2

    [root@HLZ arg_proc]# ./getopt.sh --ylong 123 -x --zlong=456 arg1 arg2   #3.2

    Option y: 123

    Option x

    Option z: 456

    Process arg1

    Process arg2

    [root@HLZ arg_proc]# ./getopt.sh --ylong 123 -v --zlong=456 arg1 arg2  #3.3

    getopt.sh:invalid option -- 'v'

    [root@HLZ arg_proc]# ./getopt.sh --ylong -x arg1 --zlong=456 arg2   #3.4

    Option y: -x

    Option z: 456

    Process arg1

    Process arg2

    如上面执行结果所示:

    3.1中,选项与参数之间一般用空格隔开,但是-z与参数456之间没有空格,而选项参数能正常解析,是因为语句eval set -- "${ARGS}"起了作用。

    3.2中,可以看出长选项参数于选项之间即可用空格间隔,亦可直接用=号,即--zlong=456

    3.3中,对于不支持的选项,如上面的-vgetopt将报错并直接退出,这是与getopts不同的地方。

    3.4中,首先,类似于短选项参数存在的问题,--ylong选项实现时是要求带参数的,但是执行时没有带参数,导致把后面的-x解析为参数,而解析不到-x选项了。同样的解决方法,对选项参数做个判断:若参数是本脚本的另一个选项,则报错退出。其次,由执行结果可见,getopt会把非选项参数按照原有参数顺序,归类并有序放在选项参数之后,如arg1 arg2

    getopts不同的是,getopt是一个独立可执行程序,更详细说明可通过man getopt查看。

     

    
    展开全文
  • 15个常用的gcc 命令选项

    万次阅读 2012-11-18 22:41:34
    GCC编译器非常强大 ,在各个发行的linux系统中都非常流行,本文介绍的是一些常用的gcc编译选项 下面这段代码将回围绕整个文章: 编辑main.c如下. #include int main(void) { printf("\n The Geek Stuff\n");...

    GCC编译器非常强大 ,在各个发行的linux系统中都非常流行,本文介绍的是一些常用的gcc编译选项

    下面这段代码将回围绕整个文章:

    编辑main.c如下.

    #include<stdio.h>
    
    int main(void)
    {
       printf("\n The Geek Stuff\n");
       return 0;
    }

    GCC编译选项

    1.指定输出可执行文件的名字

    使用最基本的gcc编译格式

    gcc main.c
    执行完上面这句命令,会在当前目录下输出一个名为a.out的可执行文件。

    使用 -o选项可以指定输出的可执行文件名称。

    gcc main.c -o main

    执行完上面语句会在当前目录下输出一个名为main的可执行文件。

    要想知道gcc编译器编译执行的过程请参考下面这个链接 

    http://www.thegeekstuff.com/2011/10/c-program-to-an-executable/

    2.让所有编译警告都显示出来

    编辑一段带警告的代码如下:

    #include<stdio.h>
    
    int main(void)
    {
       int i;
       printf("\n The Geek Stuff [%d]\n", i);
       return 0;
    }
    $ gcc -Wall main.c -o main
    main.c: In function ‘main’:
    main.c:6:10: warning: ‘i’ is used uninitialized in this function [-Wuninitialized]

    执行gcc -Wall main.c -o main 会得到未初始化变量i的警告.

    3.指定 -E编译选项,使得只输出预编译结果

    $ gcc -E main.c > main.i

    上面这条gcc 编译命令会将输出重定向到输出文件当中。上面的例子中,main.i文件中的内容就是执行-E选项gcc命令的结果。

    4.通过编译选项 -S 输出汇编代码

    gcc -S main.c > main.s

    main.s 会包含main.c的汇编输出代码

    5.指定-C 输出编译后的代码

    gcc -C main.c

    执行上面这条命令会输出main.o文件,包含机器指令代码或者编译后的代码。

    6.通过编译选项-save-temps 输出所有的中间代码。

    $ gcc -save-temps main.c
    
    $ ls
    a.out  main.c  main.i  main.o  main.s

    7.链接共享库(动态链接库)指定编译选项 -l

    gcc  -Wall main.c -o main -lCPPfile

    gcc命令指出再执行链接main.c 代码时,会链接上-lCPPfile.so动态链接库来完成生成main可执行文件。

    8.指定编译选项-fPIC 创建独立的(无关联的)地址信息代码。

    当创建动态链接库时,独立位置信息(position independent)代码也需要生成。这可以帮助动态链接库或者跟多的加载地址信息来替代其他相对的地址信息。所以-fPIC这个选项作用很大,能快速准确定位错误地址。

    下面是一个例子,

    $ gcc -c -Wall -Werror -fPIC Cfile.c
    $ gcc -shared -o libCfile.so Cfile.o

    9.打印输出有个执行过程的信息 使用-V选项

    当编译源文件时,-V选项会显示所有编译步骤的调试信息。

    例子:

    $ gcc -Wall -v main.c -o main
    Using built-in specs.
    COLLECT_GCC=gcc
    COLLECT_LTO_WRAPPER=/usr/lib/gcc/i686-linux-gnu/4.6/lto-wrapper
    Target: i686-linux-gnu
    Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.6.3-1ubuntu5' --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.6 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --enable-objc-gc --enable-targets=all --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=i686-linux-gnu --host=i686-linux-gnu --target=i686-linux-gnu
    Thread model: posix
    gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
    ...
    ...
    ...

    10.指定编译选项-ansi,支持ISO C89 programs.

    通过-ansi选项开启支ISO C89风格.

    看如下代码:

    #include<stdio.h>
    
    int main(void)
    {
      // Print the string
       printf("\n The Geek Stuff\n");
       return 0;
    }

    执行上面代码附加-ansi编译选项,编译器会输出错误因为c++ 不支持ISO C89风格。

    $ gcc -Wall -ansi main.c -o main
    main.c: In function ‘main’:
    main.c:5:3: error: expected expression before ‘/’ token
    gcc 会抛出上面错误信息。

    11.指定编译选项 -funsigned-char选项将char类型解释为unsigned char类型。

    通过这个编译选项,char 类型会被认为是unsigned char.

    例子:

    #include<stdio.h>
    
    int main(void)
    {
      char c = -10;
      // Print the string
       printf("\n The Geek Stuff [%d]\n", c);
       return 0;
    }

    执行上面代码输出:

    $ gcc -Wall -funsigned-char main.c -o main
    $ ./main
    
     The Geek Stuff [246]

    12.指定编译选项 -fsigned-char选项将unsigned char类型解释为 char类型。
    $ gcc -Wall -fsigned-char main.c -o main
    $ ./main
    
     The Geek Stuff [-10]

    13.指定-D选项 开启编译时的宏

    例子如下:

    #include<stdio.h>
    
    int main(void)
    {
    #ifdef MY_MACRO
      printf("\n Macro defined \n");
    #endif
      char c = -10;
      // Print the string
       printf("\n The Geek Stuff [%d]\n", c);
       return 0;
    }

    通过编译选项 可以直接定义宏

    $ gcc -Wall -DMY_MACRO main.c -o main
    $ ./main
    
     Macro defined 
    
     The Geek Stuff [-10]

    14.将编译警告转换成错误.

    编译警告很多时候会被我们忽视,在特殊场合我们还是需要重视编译警告,如果能把编译警告变长直接输出错误,那我们的重视程度会提高很多并去解决。

    example:

    #include<stdio.h>
    
    int main(void)
    {
      char c;
      // Print the string
       printf("\n The Geek Stuff [%d]\n", c);
       return 0;
    }

    $ gcc -Wall -Werror main.c -o main
    main.c: In function ‘main’:
    main.c:7:10: error: ‘c’ is used uninitialized in this function [-Werror=uninitialized]
    cc1: all warnings being treated as errors

    上述代码未初始化变量c,警告变成了错误提示.

    15.通过文件指定编译选项,指定@编译选项

    比较神奇的功能。可以使用@编译选项然后跟着文件名,一个以上的编译选项用空格 隔开。

    example:

    $ cat opt_file
    -Wall -omain

    $ gcc main.c @opt_file
    main.c: In function ‘main’:
    main.c:6:11: warning: ‘i’ is used uninitialized in this function [-Wuninitialized]
    
    $ ls main
    main



    原文链接:

    http://www.thegeekstuff.com/2012/10/gcc-compiler-options/

    展开全文
  • valgrind--memcheck工具命令选项

    千次阅读 2012-08-14 17:14:45
    --leak-check=:如果设为yes或full,在被调程序结束后,valgrind会详细叙述每一个内存泄露情况,默认是summary,只报道发生了几次...--leak-resolution=:这个选项设定内存检查工具在检测出多个内存泄露时,如何将这些
  • java高分局之JVM命令...这个选项将会阻止java命令运行应用,除非没有用到endorsed-standards override机制扩展机制。这个选项会检查应用是否使用了下面 的机制之一 java.ext.dirs或者java.endorsed.dirs属性被设置
  • Linux 命令格式

    千次阅读 2016-09-12 15:00:52
    简述Linux 中的命令很多,但一般在使用的时候会遵守一定的格式。为了便于使用命令,我们对...命令选项:用于调整命令的功能。命令不同,选项的个数内容会有所不同;实现的命令功能不同,选项的个数内容也会有所
  • 部分选项说明为命令帮助页面直接翻译(人工),如有错误请见谅。内容较多,Web端读者可用左侧边栏中的目录。 进程管理  进程简介   进程是计算机正在执行的程序或命令,每一个进程都是运行的实体,拥有自己的...
  • chmod 命令,主要是+s的选项

    万次阅读 2011-12-01 15:37:40
    今天在以php调用shell命令时采用exec发现apche用户过来,不能执行tar命令,所以给tar命令加了粘滞位 ...用户它控制文件或目录的访问权限。该命令有两种用法。一种是包含字母操作符表达式的文字设定法;另一种是包含
  • windows常用命令行命令

    万次阅读 多人点赞 2017-08-31 11:16:21
    也可以通过cmd /c 命令和cmd /k 命令的方式来直接运行命令 注:/c表示执行完命令后关闭cmd窗口;/k表示执行完命令后保留cmd窗口 # 控制台命令窗口中一些技巧 复制内容:右键弹出快捷菜单,选择“标记(K)”,然后...
  • Linux常用命令

    千次阅读 多人点赞 2019-01-17 18:23:49
    文章目录命令提示符命令基本格式选项的作用参数的作用常用命令分类目录操作命令ls命令命令格式常用用法cd命令命令格式常用用法mkdir命令命令格式常用用法rmdir命令命令格式常用用法tree命令命令格式常用用法文件操作...
  • Linux 命令(文件目录管理 - cp)

    千次阅读 2016-10-19 16:55:15
    简述cp 命令用来复制文件或目录。当复制多个文件时,目标文件参数必须为已经存在的目录。cp 命令默认不能复制目录,复制目录必须使用 -R 选项
  • Vi/Vim命令详解

    万次阅读 2019-08-27 10:09:17
    VIM命令可以说是Unix/Linux世界里最常用的编辑文件的命令
  • ssh用法及命令

    万次阅读 多人点赞 2016-08-21 22:15:43
    什么是SSH? 简单说,SSH是一种网络协议,用于计算机之间的加密登录。如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会泄露。最早的...
  • Linux 命令(文件目录管理 - rm)

    千次阅读 2016-10-20 11:04:53
    简述rm 命令可以删除一个目录中的一个或多个文件或目录,也可以将某个目录及其下属的所有文件及其子目录均删除掉。对于链接文件,只是删除整个链接文件,而原有文件保持不变。
  • GRUB的命令

    千次阅读 2006-06-25 07:29:00
    其中的一些命令能接在命令名后面的选项,这些选项用空格隔开。 下面的列表给出了最有用的一些命令: ·boot - 引导先前已经被指定并载入的操作系统或链式装载程序。 ·chainloader - 将指定的文件作为一个链式...
  • Linux命令 - 查看文件内容 tail 命令

    千次阅读 2017-09-12 19:51:22
    Linux命令 - 查看文件内容 tail 命令 1.介绍 tail命令用于输入文件中的尾部内容。tail命令默认在屏幕上...2.命令提供的选项列表 --retry:即是在tail命令启动时,文件不可访问或者文件稍后变得不可访问...
  • Ping 命令详解

    万次阅读 多人点赞 2017-02-10 13:28:08
    简述: ICMP协议是“Internet Control Message Ptotocol”(因特网控制消息协议)的缩写。它是TCP/IP协议族的一个子...它是用来检查网络是否通畅或者网络连接速度的命令 ping命令通常用来作为网络可用性的检查。ping命
  • rsync(一):基本命令和用法

    万次阅读 多人点赞 2019-06-11 17:40:19
    路径的格式可以是本地路径,也可以是使用user@host:path或user@host::path的远程路径,如果主机path路径之间使用单个冒号隔开,表示使用的是远程shell通信方式,而使用双冒号隔开的则表示的是连接rsync daemon。...
  • 导语 ls命令 用法 详细全选项参数解释 常用选项的例子 单选项 -l 选项 -R 选项 -t 选项 -a 选项 -d 选项 -p 选项 组合选项 ...ls相关的别名命令 ...如何列出目录中除了 当前目录 父目录 之外的所有文件包括隐
  • make命令

    千次阅读 2016-05-30 18:09:23
    make 命令 用途 维护、更新重新生成程序组。 语法 make [ -DVariable ] [ -d Option] ] [ -e ] [ -i ] [ -k ] [ -n ] [ -p ] [ -q ] [ -r ] [ -S ] [ -s ] [ -t ] [ -f MakeFile … ] [ Target … ] 描述 ...
  • Linux命令大全----系统管理相关命令

    千次阅读 2015-10-25 18:18:57
    本文主要讲了Linux命令大全----系统管理相关命令,并附有实例
  • Git: 常用命令

    万次阅读 2018-01-25 20:29:22
    Git常用命令速查表 1.git几个专用名词 Workspace:工作区 Index / Stage:暂存区【工作区的文件使用add命令后会加入暂存区,而没有直接到仓库】 Repository:仓库区(或本地仓库) Remote:远程仓库 ...
  • Linux命令(1)—— xargs 命令

    千次阅读 2017-01-08 15:18:09
    1.功能:xargs可以将stdin中以空格或换行符进行分隔的数据,形成以空格分隔的参数(arguments),传递给其他命令。...之所以用到xargs,是因为由于很多命令不支持使用管道|来传递参数,例如:find /sbi
  • 实验一二三命令

    千次阅读 2010-02-26 08:07:00
    ///实验1 Linux操作基础文本编辑useradd 用户名passwd 用户名groupadd 用户组名man 命令help命令vi 文件名i命令插入文本删除一个字符,x命令删除一行,dd命令删除剩下的行,d命令复原文字命令用u命令ndd:...
  • linux常用命令(详解)

    万次阅读 多人点赞 2018-08-29 09:45:41
    关机命令  1、shutdown –h now:立刻进行关机  2、shutdown –r now:现在重新启动计算机  3、reboot:现在重新启动计算机  4、su -:切换用户;passwd:修改用户密码  5、logout:用户注销 常用快捷...
  • Linux 文件查找内容过滤命令

    千次阅读 2018-08-28 10:11:01
    Linux 文件查找内容过滤命令 linux 文件查找内容过滤命令 grep、fgrepegrep命令  这组命令以指定模式搜索文件,并通知用户在什么文件中搜索到与指定的模式匹配的字符串,并打印出所有包含该字符串的文本行...
  • 【建议收藏】Linux工作/面试常用命令集锦

    千次阅读 多人点赞 2021-06-08 12:37:02
    管道符“|”将两个命令隔开,左边命令的输出作为右边命令的输入。连续使用管道意味着第一个命令的输出会作为 第二个命令的输入,第二个命令的输出又会作为第三个命令的输入,依此类推 1 文件管理 1.1 which 用于查找...
  • 在linux后台运行脚本命令和程序的方法大全

    万次阅读 多人点赞 2019-10-27 14:50:50
     linux提供了很多方法可以直接将普通的命令、脚本、应用程序以后台的形式运行起来,这样就不会阻塞终端窗口的继续使用。常用的涉及后台执行的命令有十几多个,包括:&、ctrl+z、bg、fg、nohup、disown、...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 135,898
精华内容 54,359
关键字:

命令和选项要用什么隔开