Ubuntu Linux编程快速入门(0-0)-Ubuntu的基本使用-基本指令

本节目录

  • 终端的打开和使用
  • 指令
    • 权限控制
    • 帮助和查看版本相关指令
    • 包管理
    • 目录操作
    • 文件操作
    • 软件开发
    • 其他指令
  • 常用脚本参数
    • 举例
  • 其他

本文主要介绍ubuntu linux的基本使用方法,对ubuntu很熟悉的读者们基本可以无视本文……当然,为笔者捉bug也可以。

终端的打开和使用

  • 在ubuntu linux下,可以通过超级键(一般就是微软徽标键)进行搜索,输入terminal,这个terminal就是终端。
    若想在指定目录下直接打开终端(即打开终端后当前目录即是文件管理器中已打开的某个目录),只需要用文件管理器打开该目录并右击空白区域,选择open in terminal即可。多数linux下通常都有这个,但这个选项的名字不一定总是相同。
  • 在ubuntu下,可以使用快捷键(默认为Ctrl+Alt+T)快速呼出终端。该快捷键可在设置中keyboard->shortcuts->Launch->Launch terminal中修改。
  • 有些linux终端下按下Tab可以自动补全和显示候选项,有些只能自动补全唯一候选项,也有的完全不起作用。
  • 类似windows,Alt+Tab可以切换窗口。
  • 如果你希望终止当前指令,使用Ctrl+C。
  • 如果X服务发生问题,可以切换到Ctrl+Alt+F1调出tty1文字终端。有的系统将GUI放在F1处,试试其他功能键(F2,F3etc)就可以了。

指令

权限控制

sudo <另一指令>

用于以高权限执行指定指令,使用当前用户的用户密码即可。需要注意的是,这不等于以root执行指令;sudo可能导致奇怪的环境变量问题。

su -

登录root用户。需要root密码。使用该命令时请谨慎,root权限意味着可以进行任何可以由用户进行的操作。也因此,不建议在远程服务器上开放root连接权限,也不要随意向你的员工提供root密码。
shell千万行,谨慎第一行。root不规范,运维两行泪。

passwd

这个指令可用于修改root密码。务必谨慎。由于很多ubuntu版本上sudo passwd就可以成功执行修改密码操作,请避免轻易向不确定是否可靠的人员提供任何用户密码。

帮助和查看版本相关指令

cat /proc/version

cat指令可以用于显示文件内容。该条指令的本质即是显示/proc/version的内容。

<包名> --version

很多包都有这种格式的版本查看选项,也有的是-v,也有些需要使用cat。

<包名> --help

很多包支持这样的帮助选项,或者是–h选项显示帮助。也有些包在没有选项时显示帮助信息。但也有些包在没有选项时也会正确执行,尽管你可能不希望它执行,务必注意。

man <目标>

该指令用于提供目标的帮助文档。例如,man pthread_exit指令可以显示官方的pthread_exit的posix文档。

help <目标>

用于获取关于目标的帮助。shell内建指令结构等适用该格式。

包管理

本文中包管理器主要指的是npm和apt-get。

<包管理器名> install <包名>

pip,apt-get,npm都适用这个选项。其中,pip用于python,npm常用于nodejs,apt-get则用于绝大多数常用的linux包。
此外,网上可以下载到cnpm,使用cnpm下载国内镜像可以提高下载速度。例如apt-get install byobu就可以安装byobu包。

<包管理器名> upgrade <包名>

npm和apt-get适用。

apt-get update

可以用来升级ubuntu系统。

目录操作

pwd

显示当前所在目录(即工作目录)。

cd <目标目录>

切换至一个已存在的目录。目标目录可以是绝对或相对目录。

mkdir <新文件夹名>

在当前操作位置创建一个新的文件夹。在某些ubuntu下是md指令。

ll <目标目录>

列出已存在的目标目录下的文件和文件夹细节,可能需要安装另外的包。没有递归。
未指定目标目录时,缺省为当前目录。

ls <目标目录>

列出已存在的目标目录下的文件和文件夹,没有细节,没有递归。
未指定目标目录时,缺省为当前目录。

tree <目标目录>

列出已存在的目标目录下的文件和文件夹,没有细节,递归地显示所有子目录。一般需要安装另外的包。
未指定目标目录时,缺省为当前目录。

文件操作

rm -f <文件或目录名列表>

用于删除文件。目标文件或目录以空格分开。-f选项用于忽略列表中不存在的项目。
该指令较为危险,任何涉及rm指令的应用环境都应当再三检查。尤其是删除当前目录下全部文件的指令rm -f ./*,如果点后意外加入了空格,则会按照通配符匹配,尝试删除硬盘上的任何文件,包括部分系统关键文件。

mv <> <目标>

用于把源所指定的文件或文件夹移动到目标所指定的位置,可以指定另外的名称。也可用于重命名文件或文件夹。也即,两个参数作为文件时都是完整参数。

cp <> <目标>

用于把源所指定的文件复制到目标所指定的目录,也可指定为另外的名称,加上文件名即可。笔者的ubuntu上,源不能是目录。

vim <文件名>

用于编辑已有文件和新建文件。当文件名指定的文件不存在时,使用保存功能就能新建一个。尽管也可以打开文件夹,但不建议随意编辑文件夹。小规模编辑时,不带插件的vim用起来比绝大多数文本编辑器还要方便许多。

  • 进入vim后为普通模式。普通模式下按下I进入编辑模式,编辑模式下按下ESC回到普通模式,普通模式下按下:进入命令模式。不过由于一些笔者不太了解的原因,按A似乎也会进入编辑模式。
    普通模式下,HJKL分别是左移、下移、上移、右移光标,使用方向键也可以。W移动至下一个token,E移动至当前或下一个(如果已经在当前token尾)token尾,B回退光标至上一个token。U撤销,Ctrl+R重做。
  • 编辑模式没什么特别的,该怎么写怎么写就对了。
  • 命令模式下,:q退出,:wq保存后退出,:w保存,:u撤销,:q!强制退出(不保存退出)。键入命令后按下Enter执行。

以上只是基本操作,要深入了解vim,建议读者阅读陈皓前辈创作和翻译的文章。若要大规模编辑文档、代码等,建议加上插件,或者直接选用vscode、sublime等编辑器。gedit也可用一用,但gedit可以说是笔者见过的仅次于notepad的最简陋编辑器(微软:人在家中坐,锅从天上来)。

file <文件名>

该指令可以用来查看文件类型。对于可执行文件还会显示其所适用的CPU架构。

ln -s <目标项目> <软链接名字>

该指令可以创建一个软链接,其中,软链接名字可以附带目录,不附带目录的话会直接生成在工作目录。

chmod <选项> <文件名>

用于修改指定文件的访问权限。linux默认访问权限控制的粒度很粗,只有读、写、执行三种主要权限(但是还有SUID和EUID的概念,本质上也还是这三类权限,这里不作详述),采用4读2写1执行作为对应权限的代号。很明显,越敏感的权限,对应数字越小。综合权限以开放权限的总和表示。例如,7表示完全访问权限,5表示可读可执行。常用选项为755表示所有人可以读可以执行,但只有sudoer权限和root能修改;777表示所有用户有完全权限。

软件开发

objdump -D <文件名>

用于检查目标文件和elf文件的内容。对于初学者来说其实没什么用。

make <选项>

用于Makefile辅助编译链接等。笔者会在其他文章中详述用法。

gcc <选项>
g++ <选项>

用于C和C++的编译链接等。笔者会在其他文章中详述用法。

pkg-config <选项> <库名>

pkg-config是一种辅助开发的工具。常见用法:
选项为–libs时,输出指定库的C++链接选项。
选项为–cflags时,输出指定库的C++预编译选项。
此外还有一种不使用库名的选项–list-all,它列出所有可用的C++库。如果安装了库但这里没列出来,应该是缺失.pc文件导致的。

其他指令

exit

用于退出终端。也可以用于退出其他部分包。也有的包用的是quit,或二者都不支持。

clear

用于清空当前终端上的显示内容。

echo <内容>

输出指定内容到屏幕上。

echo <内容> > <文件名>

将输出重定向至文件。大多数形式的输出都可以用类似方法。但是请避免echo aaa > ttyUSB0这样的操作,虽然确实可以向usb口成功发出信息,但会对usb口属性信息造成破坏。其实它根本就不是文件来着。笔者初学时被坑过。

git <选项>

git指令用于版本管理。笔者会在其他文章中介绍其用法。

ssh <选项>

ssh指令用于和远程主机建立ssh连接。笔者会在其他文章中介绍其用法。

ssh-keygen <选项>

生成用于ssh连接的rsa密钥。笔者会在其他文章中简述其用法。

uname -a

获取当前架构名称、系统名称等。

which <指令名>

查询指令名对应的文件位置,如果是内置指令的话不会输出任何东西。

dirname <路径>

这个指令会把每个参数当成路径,然后分别输出最后一个斜杠之前的内容。表面上是输出父目录,但是对于.和…两个特殊目录都输出.。对…/…的输出也不是其父目录。

true

总返回真(0)。

false

总返回假(1)。这里和C++的逻辑正相反。

grep <正则表达式>

用于以正则表达式从文件中选取指定内容。常与管道共同使用。

xargs

可以用管道将另一个文件的输出分解成供其他指令使用的token。

find <查找的根目录> <指定特性和值>
#下面是一个例子
find /usr -name src -type d

这个指令用于查找文件系统中的项目。例子中,-name指定项目名称src,-type指定项目类型为目录(另一个常用的是f,表示普通文件),它会输出找到的项目(但也可以不输出)。

expr <表达式>

输出数学表达式的值。写脚本很有用。需要注意的是,表达式中token之间需要空格。

mount <设备文件> <挂载点>

挂载点必须是已经存在、已经挂载的文件夹。设备文件通常是/dev目录下一个块设备。该指令可以将尚未挂载的磁盘挂载到指定挂载点,挂载后就可以通过挂载点来访问。

umount <设备文件>

卸载指定磁盘。

常用脚本参数

$0

这个参数的内容是脚本被调用时输入的指令首个token。

$?

这个参数返回上条指令返回值。

$#

这个参数返回脚本参数token数。不含$0本身。

$<数字>

返回指定位置上的token。

举例

../test/cmdname arg1 "arg 2"

它的$0是…/test/cmdname(不会跟据工作目录自行形成绝对路径,而是完全保留文本),$1是arg1,$2是arg 2(保留空格,不含双引号。其他影响tokenization的语法类同),$#是2。

其他

  • 类似于Windows,通配符*可以匹配任何字符串,通配符?可以匹配单个字符。目录中,./表示当前目录,..表示上级目录,/表示根目录(当然,指的是第一个斜杠),~一般指用户目录,-表示上次的工作目录(最近一次改变工作目录前的工作目录)。
  • >字符用于重定向输出,一般而言需要和前后内容各至少隔开一个空格。这在除了echo外的指令中通常也是适用的。
  • #字符被用作shell的注释符。需要注意的是,通常而言,注释内容需要和指令隔开至少一个空格。
> echo a #b
a
> echo a#b
a#b
> echo #b

  • |用于以管道联系两个程序。
  • &<数字>用于指定文件描述符。默认地,stderr为2,所以&2表示stderr。
  • &&表示逻辑与,||表示逻辑或。和C具有一样的短路机制。
  • bash支持一种内嵌的简单数字运算语法,即$((表达式))。例如,$((1+1))将得到2。但是需要注意,stderr的描述符是有可能不为2的(尽管十分不推荐修改它的行为)。由于Linux的底层特性,关闭2号描述符后打开另一个文件将导致描述符2被占用,此时再打开stderr,其描述符将不再是2。一个良好的编程建议是除非明确知道自己在做什么并且确保任何情形下都可以正确复原(包括保证线程安全性、信号可重入安全性、进程沟通、底层调用等一切情况),否则任何时候都不要对stdin、stdout、stderr进行关闭或其他任何导致文件描述符变化的操作
  • 利用${变量名}不仅可以引用变量,还可以对变量进行其他基于字符串的处理。例如,${#变量名}返回变量字符串长度。
  • 变量名=值,这个语法可以给变量赋值,不需要额外的指令。
  • 如果想要列出什么内容,试试ls<内容类型>。例如,想要列出usb设备,就试试lsusb指令。很多类型的项目有类似指令。

你可能感兴趣的:(C++,Ubuntu)