linus命令,环境变量

一、linux命令。
1、cp  -> 拷贝文件/目录。
用法:cp 需要拷贝的文件/目录的路径 ... 目标目录的路径

1)拷贝文件到目录下。
gec@ubuntu:~$ cp kkk.c test   -> 拷贝一个
gec@ubuntu:~$ cp aaa.c bbb.c kkk.c test  -> 拷贝多个
gec@ubuntu:~$ sudo cp aaa.c /

2)拷贝目录到目录下。
gec@ubuntu:~$ cp test test2 -r   -> test2在,就直接将test/目录拷贝到test2目录下。
                 -> test2不在,就先创建test2,然后将test/目录拷贝到test2目录下。

gec@ubuntu:~$ cp test test2 test3 -r  -> test3必须存在,否则就会报错。

2、mv  -> 移动/重命名。
gec@ubuntu:~$ mv aaa.c ggg.c   -> 将aaa.c这个文件的名字修改为ggg.c
gec@ubuntu:~$ mv bbb.c test4   -> 将bbb.c这个文件移动到test4这个目录下

test5是不存在的:
gec@ubuntu:~$ mv test test5   -> 将test目录的名字修改为test5。

test6是存在的:
gec@ubuntu:~$ mv test2 test6  -> 将test2这个目录移动到test6下。

3、cat   -> 查看文件内容。
用法: cat 需要查看内容的文件路径。

gec@ubuntu:/mnt/hgfs/GZ2057/01 C语言/13/code/fuhao$ cat test.c
#include "my_head.h"
#define ok 0

int main(int argc,char *argv[])
{
    int a = 0;
    if(a == ok)

gec@ubuntu:/mnt/hgfs/GZ2057/01 C语言/13/code/fuhao$ cat test.c -n  (-n:连行号一起打印)
     1    #include "my_head.h"
     2    #define ok 0
     3    
     4    int main(int argc,char *argv[])
     5    {
     6        int a = 0;
     7        if(a == ok)

4、chmod  -> 修改权限。
1)什么是权限?

 类型   权限
  -   rw-rw-r-- 1 gec gec       0 Aug 20 18:09 ggg.c

该权限分开三个权限来看:
rw-   创建者权限user(u)     -> 创建者可读可写不可执行。
rw-   组权限group(g)        -> 组可读可写不可执行。
r--   其他人权限other(o)    -> 其他人可读不可写不可执行。

                权重
r  -> read     读权限         4
w  -> write    写权限             2
x  -> execute  执行权限           1
-  -> 代表没有这个位置的权限       0

2)如何修改文件/目录的权限?
单个修改:
公式:chmod (u/g/o)(+/-)(r/w/x) 需要修改的文件路径。

例子1:想给ggg.c这个文件的创建者添加一个执行权限。
       chmod u+x ggg.c 

例子2:想删除ggg.c这个文件的其他人的读权限。
       chmod o-r ggg.c

多个修改:
例子3: 想把ggg.c这个文件的权限修改为  --xr-x-w-

1)计算修改权限之后总权重是多少?
   创建者: 0 + 0 + 1 = 1
   组:     4 + 0 + 1 = 5
   其他人: 0 + 2 + 0 = 2

 总权重:152

2)直接使用chmod命令修改权限。
公式:chmod 总权重 需要修改权限的文件的路径
      chmod 152 ggg.c
   
5、tar   -> 解压/压缩
在linux下,压缩包都是.gz/.bz2结尾的。

参数:
z: 处理以.gz结尾的压缩包。
j: 处理以.bz2结尾的压缩包。
x: 决定了tar命令是解压命令。
c: 决定了tar命令是压缩的命令。
v: 以可见的方式进行处理   -> 不是必要选项。
f: 不可忽略文件。
-C 路径: 指定解压的路径   例如:想解压到家目录下  -C /home/gec

1)先将内容全部拷贝到一个目录下。
gec@ubuntu:~$ cp 11.c 22.c ggg.c test4/ test5/ test6/ demo -r

2)压缩该目录,变成一个压缩包。
gec@ubuntu:~$ tar zcvf demo.tar.gz demo/
demo/
demo/test4/
demo/test4/bbb.c
demo/ggg.c
demo/22.c
demo/test6/
demo/test6/test2/
demo/test6/test2/aaa.c
demo/test6/test2/kkk.c
demo/test6/test2/bbb.c
demo/11.c
demo/test5/
demo/test5/aaa.c
demo/test5/kkk.c
demo/test5/bbb.c

 在当前目录下,会出现一个压缩包叫demo.tar.gz

3)解压压缩包。
gec@ubuntu:~$ tar zxvf demo.tar.gz -C /home/gec

二、文件种类。
1、能不能通过后缀去判断是文件还是目录?
不能。
touch dir       ->  这个dir是一个普通文件
mkdir test.txt  ->  这个test.txt是一个目录。

结论1: 最准确就是通过"ls -l"去查看文件的类型。(“-”代表普通文件,“d”代表目录)

 类型
  -   rw-rw-r-- 1 gec gec       0 Aug 20 19:19 dir
  d   rwxrwxr-x 2 gec gec    4096 Aug 20 19:19 test.txt

结论2: 只要通过touch命令来创建,无论叫什么名字,都是一个普通文件。
        只要通过mkdir命令来创建,无论叫什么名字,都是一个目录。

2、在linux下,一共有多少种文件类型?
一共有7种。
"-"  普通文件      1.jpg 2.mp3 3.bmp 4.txt 5.doc
"d"  目录文件      dir
"l"  链接文件      类似于windows中的快捷方式
"p"  管道文件      进程之间的通信
"s"  套接字文件    用于网络通信
"c"  字符设备文件  读取设备数据时,是按字节为单位来读取的  -> LCD液晶/触摸屏
"b"  块设备文件    读取设备数据时,按块为单位来读取的      -> U盘/SD卡

3、文件夹与目录是一样的吗?
文件夹是一个容器,文件夹里面的内容永远都会小于这个文件夹的大小。  -> windows
目录是一棵树,目录与目录之间就是一个索引关系。                   -> linux

三、文件权限。
1、为什么文件起始权限都是664,目录的起始权限都是775?
rw-rw-r--  文件都是664,说明文件没有执行权限。
rwxrwxr-x  目录都是775,说明目录有执行权限。

1)文件没有读权限,会怎样?
--wx-wx-wx 1 gec gec 0 Aug 20 19:43 1.c

gec@ubuntu:~$ cat 1.c
cat: 1.c: Permission denied  -> 权限拒绝。   -> 但是使用sudo还是可以的。

2)文件没有写权限,会怎样?
-r-xr-xr-x 1 gec gec 19 Aug 20 19:52 1.c
可以使用vi打开文件,但是修改不了内容。      -> 但是使用sudo还是可以的。

3)文件没有执行权限,会怎样?
-rw-rw-rw- 1 gec gec 8600 Aug 20 19:56 1

gec@ubuntu:~$ ./1
bash: ./1: Permission denied
gec@ubuntu:~$ sudo ./1
sudo: ./1: command not found    -> 叫大哥过来也没用。

4)目录没有读权限,会怎样?
d-wx-wx-wx 5 gec gec    4096 Aug 20 19:10 demo

gec@ubuntu:~/demo$ ls
ls: cannot open directory '.': Permission denied
gec@ubuntu:~/demo$ sudo ls
11.c  22.c  ggg.c  test4  test5  test6

5)目录没有写权限,会怎样?
dr-xr-xr-x 5 gec gec    4096 Aug 20 20:02 demo

gec@ubuntu:~/demo$ touch kkk.c
touch: cannot touch 'kkk.c': Permission denied
gec@ubuntu:~/demo$ sudo touch kkk.c   -> 但是使用sudo还是可以的。

6)目录没有执行权限,会怎样?
切换不进去,叫大哥过来也没用。

四、文件/目录起始权限都是与系统中"umask"有关。
1、什么是umask?
其实umask就是影响着文件/目录起始权限的一个数字,这个数字可以通过用户去修改它。

2、在linux下,如何查看umask值?
gec@ubuntu:~$ umask
0002   -> 当前系统中的umask值。
  
0   -> 第一个0属于无效位。
002 -> 后面三个数字才是真正的umask的值。

3、umask值与文件起始权限有什么关系?
公式:
文件起始权限 = 666 - umask = 666 - 002 = 664

  rw-  rw-  rw-          rw-  rw-  rw-
- ---  ---  -w-       -  ---  ---  --x
==================     =================
  rw-  rw-  r--          rw-  rw-  rw-

目录起始权限 = 777 - umask = 777 - 002 = 775

  rwx  rwx  rwx
- ---  ---  -w-
===================
  rwx  rwx  r-x

4、修改umask的方法。
1)临时修改。  -> 重启终端无效。
gec@ubuntu:~$ umask 0000
gec@ubuntu:~$ umask 
0000
gec@ubuntu:~$ touch ggy.c
gec@ubuntu:~$ ls -l ggy.c
-rw-rw-rw- 1 gec gec 0 Aug 20 20:27 ggy.c   (666-000=666)
gec@ubuntu:~$ 

2)永久修改。
思路:其实系统打开终端时,会默认先执行一个脚本文件:~/.bashrc,我们只需要将修改umask的命令写入到脚本中,再生效脚本,那么每一次打开终端就会修改了。

第一步:先打开脚本文件。
gec@ubuntu:~$ gedit /home/gec/.bashrc

第二步:找到文件最末尾的地方,添加以下的内容。
umask 0000
   
===========================================
  elif [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
  fi
fi   ->文件末尾

umask 0000   -> 添加这句话
===========================================

第三步: 保存退出
第四步: 重启生效脚本。  /  重启终端
gec@ubuntu:~$ source /home/gec/.bashrc

3)在程序中修改umask的值,不会影响到系统中的umask。  -> umask()   -> man 3 umask

头文件:#include <sys/stat.h>
原型:
  mode_t umask(mode_t cmask);

cmask: 需要修改的umask的值。   -> 也就是说如果想修改为0000,你只需要"umask(0000)"

返回值:设置过的umask的值。

========================执行前=================
gec@ubuntu:/mnt/hgfs/GZ2057/02 linux基础/02/code$ umask
0002

========================执行时==================
#include <sys/stat.h>
#include <stdlib.h>

int main(int argc,char *argv[])
{
    /* 1. 当前的umask就是系统的umask*/
    system("umask"); //0002 这个system()函数功能就是在程序中执行linux命令。
    
    /* 2. 在程序中设置umask的值 */
    umask(0000);  //只是在程序中修改,不会影响到系统的umask的值。
    
    system("umask"); //0000
    system("mkdir /home/gec/ggy_test"); //777-000=777  由于程序中已经修改为000.所以使用程序中的000  
    
    return 0;
}

========================执行后=================
gec@ubuntu:/mnt/hgfs/GZ2057/02 linux基础/02/code$ umask
0002

五、linux根目录存放着什么文件?
gec@ubuntu:/$ ls
bin   cdrom  etc   initrd.img  lib32  libx32      media  opt   root  sbin  srv  tmp  var
boot  dev    home  lib         lib64  lost+found  mnt    proc  run   snap  sys  usr  vmlinuz

常用目录:
bin:存放着常用的linux命令或者可执行程序。
etc:配置文件。
lib:库文件。
root:超级用户的家目录
sbin:只有超级用户才能使用的命令。
boot:系统镜像文件。
 
  memtest86+_multiboot.bin   memtest86+.bin   -> uboot引导程序。
  vmlinuz-4.10.0-28-generic                   -> kernel内核镜像。
  initrd.img-4.10.0-28-generic                -> fs文件系统。

dev:硬件设备的驱动文件。
home:普通用户家目录的所在地。
mnt:挂载目录 (共享目录)
proc:进程的资源
usr:第三方安装程序的所在地
   /usr/bin      -> 第三方程序的可执行程序。
   /usr/include  -> 第三方程序的头文件。
   /usr/lib      -> 第三方程序的库文件。
   /usr/share    -> 第三方程序的帮助文档。

六、环境变量。
1、什么是环境变量?
就是系统中的一些属性,例如:我想回家目录,我们会写"cd"就可以,为什么"cd"可以直接回家,因为linux的环境变量中已经写好了回家就会默认回到/home/gec。换句话说,当我们需要寻找某些东西,就会去环境变量中寻找。

2、如何查看系统中环境变量?
USER、PATH、PWD、HOME、OLDPWD都是环境变量。

gec@ubuntu:~$ env
USER=gec          -> 用户名,为什么输入whoami会打印gec出来,因为在环境变量中,我的名字就是gec。
PWD=/home/gec     -> 当前所在的路径 为什么输入pwd会打印当前的工作。
HOME=/home/gec    -> 解析了为什么输入cd会直接回家,因为输入会默认切换到HOME环境变量所在地。
OLDPWD=/var       -> 为什么输入cd -会回到刚刚去过的路径,因为在环境变量下,刚刚去过的路径保存在OLDPWD下。

PATH=/home/gec/bin:/home/gec/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/arm/5.4.0/usr/bin   -> 可执行程序的路径

3、分析PATH这个环境变量。
PATH=/home/gec/bin:
     /home/gec/.local/bin:
     /usr/local/sbin:
     /usr/local/bin:
     /usr/sbin:
     /usr/bin:
     /sbin:
     /bin:
     /usr/games:
     /usr/local/games:
     /snap/bin:
     /usr/local/arm/5.4.0/usr/bin
    

  例子1: 我们都知道,现在在任何的路径下使用ls这个命令,但是我们发送ls这个命令是在/bin,为什么我们执行ls时,不需要指出ls这个程序的路径?执行时候为什么不是:"/bin/ls"。

回答:因为ls是/bin目录下的,而/bin目录是属于环境变量PATH中一个路径,所以在使用ls时,其实系统就会去环境变量PATH中所有路径中寻找有没有ls这个命令。结果在bin/找到了,就可以在任何的路径下使用ls。

  例子2: 编译完一个程序之后,如何执行?

gec@ubuntu:~$ ./hello  -> 指定执行当前目录下的hello这个程序,所以一定要在当前目录下找到了这个hello才能正常执行。
helloworld!

gec@ubuntu:~$ hello
hello: command not found
如果直接写hello,不会在当前目录下寻找,而是去环境变量下寻找,结果没有找到,所以执行失败。

4、环境变量的使用。
假设当前目录下有一个文件叫hello,我想在任何的路径下都可以直接输入hello,就可以得到结果。

===========================================
做法一:把hello这个程序拷贝到/bin。
gec@ubuntu:~$ sudo cp hello /bin

接下来,就可以在任何的路径下使用"hello"。
===========================================

做法二:把hello所在的路径"/home/gec"添加到环境变量PATH中。

添加之前:
gec@ubuntu:~$ echo $PATH
/home/gec/bin:/home/gec/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/arm/5.4.0/usr/bin

添加路径的命令:
gec@ubuntu:~$ export PATH=$PATH:/home/gec

添加之后:
gec@ubuntu:~$ echo $PATH
/home/gec/bin:/home/gec/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/arm/5.4.0/usr/bin:/home/gec

接下来,就可以在任何的路径下使用"hello",因为在使用hello在环境变量PATH中/home/gec找到了hello。

   练习:自己写一个程序print_name,要求这个程序在放在家目录下的一个project目录下,这个程序的功能就是可以打印自己名字的缩写,要求可以永久在任何的路径下输入"print_name",就可以得到自己名字的缩写。

1)在家目录先创建一个名字叫project目录。
   cd 
   mkdir project

2)在project目录下创建一个print_name.c,然后编译程序。
   
------------------------------
#include <stdio.h>

int main(int argc,char *argv[])
{
    printf("ggy\n");
    return 0;
}
-------------------------------

3)编译程序,生成一个名字为print_name的可执行程序。
gec@ubuntu:~/project$ gcc print_name.c -o print_name

4)打开脚本文件。
   gedit ~/.bashrc

5)在文件末尾添加以下的这句话。
export PATH=$PATH:/home/gec/project   -> 下次寻找文件时,也会在/home/gec/project寻找。

6)生效该脚本。  
   source ~/.bashrc

7)可以在任何的路径下使用print_name
gec@ubuntu:~/project$ print_name
ggy

5、万一把环境变量弄丢了,怎么办?
1)不要慌。
2)直接输入: export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin  -> 临时修改。
3)打开脚本: gedit ~/.bashrc
4)修改回脚本的内容:
   export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin   -> 永久修改。

5)重启终端。

七、命令行功能。
1、可以补齐linux命令与文件名。
1)补齐文件名。
gec@ubuntu:~$ cd D                   -> 按两下Tab键
Desktop/   Documents/ Downloads/     -> 所有以D开头的目录都列出来。

gec@ubuntu:~$ cd Do           -> 按两下Tab键
Documents/ Downloads/         -> 所有以Do开头的目录都列出来。

gec@ubuntu:~$ cd Doc          -> 按一下Tab键
gec@ubuntu:~$ cd Documents/   -> 自动补齐

2)补齐命令。
gec@ubuntu:~$ mk  -> 按两下Tab键
mkdir             mkfontscale       mkfs.ext3         mkfs.msdos        mkisofs           mkntfs            mkzftree
mkdosfs           mkfs              mkfs.ext4           -> 将全部mk开头的命令都列出来。  

gec@ubuntu:~$ mkd    -> 按两下Tab键
mkdir    mkdosfs     -> 将全部mkd开头的命令都列出来。

gec@ubuntu:~$ mkdi   -> 按一下Tab键
gec@ubuntu:~$ mkdir  -> 自动补齐

2、记忆已经输入过的命令。
使用方向键来控制: ↑:上一条命令  ↓:下一条命令。
这些命令都是存放在一个文件中: ~/.bash_history

3、给命令取别名。
# some more ls aliases
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'
alias c='clear'
alias p='pwd'

 

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值