草庐IT

Linux:可执行程序的Shell传参格式规范

Orion's Blog 2023-03-28 原文

1. Linux下可执行程序的Shell传参格式规范

Linux下的可执行程序在运行时经常需要传一些参数,而这些参数是有规范的。包括我们自己写的在Linux系统下运行的Shell脚本、Python脚本等可执行程序,最好也遵循相关规范。我们下面以Linux命令为例来讲解参数规范:

Linux命令行的格式规范如下:

orion-orion@MyDesktop ~ % command [-options] parameter1 parameter2

上述命令详细说明如下:

  1. 一行命令中第一个输入的部分绝对是命令(command)或可执行文件(例如Shell脚本)。
  2. 中括号[]并不存在于实际的命令中,表示该参数是可选的,而加入选项设置时,通常选项前会带-符号,例如-h;如果要使用选项的完整全名,选项前会带--符号,例如--help
  3. parameter1parameters2可以为依附在选项后面的参数,也可以为command的参数。
  4. 命令、选项、参数之间以空格来区分,无论空几格Shell都视为一格,所以空格是很重要的特殊字符。
  5. 命令太长的时候,可使用反斜杠(\)来转义回车键,使命令连续到下一行(注意,换行符属于特殊字符,而反斜杠后立刻接着特殊字符才能转义)。

此外,需要注意在Linux系统中英文大小写字母是不一样的,例如cd命令和CD并不同。

2. 实例

我们下面举几个命令的传参实例。

ls -al ~

ls为命令名。-al-a -l的简写,意为使用-a(列出包括隐藏文件在内的所有文件)与-l(列出文件属性)这两个选项。~ls命令的参数,意为家目录。

tar -xvf test3.zip -C .

tar为命令名。-xv意为使用-x(解压操作)与-v(可视化解压过程)这两个选项。-f意为指定压缩文件的名称,后面依附着test3.zip做为该选项的参数。-C意为指定解压后的目录,后面依附着.(当前目录)做为该选项的参数。

注意,-f test3.zip也可以写成--file test3.zip--file=test3.zip(为--开头的选项设置参数时都可以使用等号赋值)。

当我们直接在Shell中键入man command查看命令操作说明(manual)时,可以看到文档中对参数格式有详细描述:

TAR(1)                       General Commands Manual                      TAR(1)

NAME
     tar – manipulate tape archives

SYNOPSIS
     tar [bundled-flags ⟨args⟩] [⟨file⟩ | ⟨pattern⟩ ...]
     tar {-c} [options] [files | directories]
     tar {-r | -u} -f archive-file [options] [files | directories]
     tar {-t | -x} [options] [patterns]

像其他可执行程序(如Git)一般也会遵循类似的传参规范:

GIT(1)                             Git Manual                             GIT(1)

NAME
       git - the stupid content tracker

SYNOPSIS
       git [--version] [--help] [-C <path>] [-c <name>=<value>]
           [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
           [-p|--paginate|-P|--no-pager] [--no-replace-objects] [--bare]
           [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
           [--super-prefix=<path>] [--config-env <name>=<envvar>]
           <command> [<args>]

可以看到,git在设置--开头的选项的参数时就希望我们采用=赋值方式,如--git_dir=/home/domain/.git,这种方式比--git_dir /home/domain/.git更为直观。

Python脚本的运行也采用类似的传参风格,如:

python3 search.py -v -p spam --pat=eggs foo.txt bar.txt -o results \
    --speed=fast

具体如何用Python编写解析命令行选项的程序,我们下一节再展开叙述。

参考

  • [1] 鸟哥. 鸟哥的 Linux 私房菜: 基础学习篇[M]. 人民邮电出版社, 2018.

有关Linux:可执行程序的Shell传参格式规范的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby-openid:执行发现时未设置@socket - 2

    我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass

  3. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  4. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  5. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  6. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  7. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  8. ruby-on-rails - Rails 应用程序中的 Rails : How are you using application_controller. rb 是新手吗? - 2

    刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr

  9. ruby - Chef 执行非顺序配方 - 2

    我遵循了教程http://gettingstartedwithchef.com/,第1章。我的运行list是"run_list":["recipe[apt]","recipe[phpap]"]我的phpapRecipe默认Recipeinclude_recipe"apache2"include_recipe"build-essential"include_recipe"openssl"include_recipe"mysql::client"include_recipe"mysql::server"include_recipe"php"include_recipe"php::modul

  10. ruby-on-rails - 如何在 ruby​​ 交互式 shell 中有多行? - 2

    这可能是个愚蠢的问题。但是,我是一个新手......你怎么能在交互式ruby​​shell中有多行代码?好像你只能有一条长线。按回车键运行代码。无论如何我可以在不运行代码的情况下跳到下一行吗?再次抱歉,如果这是一个愚蠢的问题。谢谢。 最佳答案 这是一个例子:2.1.2:053>a=1=>12.1.2:054>b=2=>22.1.2:055>a+b=>32.1.2:056>ifa>b#Thecode‘if..."startsthedefinitionoftheconditionalstatement.2.1.2:057?>puts"f

随机推荐