docker run
asn@hadoop1:~/Desktop$ docker run --help
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
Run a command in a new container
-a, --attach=[] Attach to STDIN, STDOUT or STDERR
--add-host=[] Add a custom host-to-IP mapping (host:ip) 增加一個定制的'主機-IP'映射
--blkio-weight=0 Block IO (relative weight), between 10 and 1000 -c, --cpu-shares=0 CPU shares (relative weight)
--cap-add=[] Add Linux capabilities 增加linux能力 --cap-drop=[] Drop Linux capabilities
--cgroup-parent= Optional parent cgroup for the container
--cidfile= Write the container ID to the file 把容器的ID寫入文件
--cpu-period=0 Limit CPU CFS (Completely Fair Scheduler) period --cpu-quota=0 Limit the CPU CFS quota --cpuset-cpus= CPUs in which to allow execution (0-3, 0,1) --cpuset-mems= MEMs in which to allow execution (0-3, 0,1)
-d, --detach=false Run container in background and print container ID 在后台運行容器並打印容器ID
--device=[] Add a host device to the container 把一個主機設備添加到容器
--dns=[] Set custom DNS servers 設置定制的域名服務器 --dns-search=[] Set custom DNS search domains 設置定制的域名服務器的搜索域
-e, --env=[] Set environment variables 設置環境變量
--entrypoint= Overwrite the default ENTRYPOINT of the image 覆蓋鏡像的默認進入點
--env-file=[] Read in a file of environment variables 讀入一個包含環境變量的文件
--expose=[] Expose a port or a range of ports 暴露一個端口、端口范圍
-h, --hostname= Container host name 容器的主機名
-i, --interactive=false Keep STDIN標准輸入 open even if not attached
--ipc= IPC namespace to use 使用的IPC命名空間 --pid= PID namespace to use 使用的PID命名空間 --uts= UTS namespace to use
-l, --label=[] Set meta data on a container 在容器上,設置元數據
--label-file=[] Read in a line delimited file of labels
--link=[] Add link to another container 添加一個到另一個容器的連接
--log-driver= Logging driver for container 容器的日志驅動 --log-opt=[] Log driver options
--lxc-conf=[] Add custom lxc options 添加定制的lxc選項
-m, --memory= Memory limit 內存限制
--mac-address= Container MAC address (e.g. 92:d0:c6:0a:29:33) 容器的MAC地址
--memory-swap= Total memory (memory + swap), '-1' to disable swap 容器的總內存(物理內容+交換區)
--name= Assign a name to the container 為容器分配一個名字
--net=bridge Set the Network mode for the container 為容器設置網絡模式
--oom-kill-disable=false Disable OOM Killer
-P, --publish-all=false Publish all exposed ports to random ports -p, --publish=[] Publish a container's port(s) to the host 把容器的端口發布到主機
--privileged=false Give extended privileges to this container 賦予容器擴展權限
--read-only=false Mount the container's root filesystem as read only 以只讀的方式裝載容器的根文件系統
--restart=no Restart policy to apply when a container exits
--rm=false Automatically remove the container when it exits 當容器存在時,自動移除容器
--security-opt=[] Security Options 安全選項
--sig-proxy=true Proxy received signals to the process
-t, --tty=false Allocate a pseudo-TTY 分配一個偽終端
-u, --u-user= Username or UID (format: <name|uid>[:<group|gid>]) --ulimit=[] Ulimit options
-v, --volume=[] Bind mount a volume --volumes-from=[] Mount volumes from the specified container(s) -w, --workdir= Working directory inside the container |
Docker會在隔離的容器中運行進程。 當運行docker run命令時,Docker會啟動一個進程,並為這個進程分配其獨占的文件系統、網絡資源和以此進程為根進程的進程組。 在容器啟動時,鏡像可能已經定義了要運行的二進制文件、暴露的網絡端口等,但是用戶可以通過docker run命令重新定義(譯者注:docker run可以控制一個容器運行時的行為,它可以覆蓋docker build在構建鏡像時的一些默認配置),這也是為什么run命令相比於其它命令有如此多的參數的原因。 使用方法: docker run [OPTIONS] IMAGE [COMMAND] [ARG...] OPTIONS總起來說可以分為兩類:
Operator exclusive options當執行docker run時可以設置以下參數:
====================================================== Detached vs foreground -d=false, 沒有附加標准輸入、輸出、錯誤 ---- 運行在后台
-d=false --detach=false 那么容器將會運行在后台模式。 此時所有I/O數據只能通過網絡資源或者共享卷組來進行交互,因為容器不再監聽你執行docker run的這個終端命令行窗口。 但你可以通過執行docker attach來重新附着到該容器的回話中。 需要注意的是,容器運行在后台模式下,是不能使用--rm選項的。 不指定-d參數(為明確給-d選項指定值,取默認值false) --在前台模式下 Docker會在容器中啟動進程,同時將當前的命令行窗口附着到容器的標准輸入、標准輸出和標准錯誤中 --- 把當前的命令行窗口附着到容器的標准輸入、輸出、錯誤上 也就是說容器中所有的輸出都可以在當前窗口中看到。 甚至它都可以虛擬出一個TTY窗口,來執行信號中斷。這一切都是可以配置的:
-a=[], --attach=[] 把容器的標准輸入、輸出、錯誤附着到當前的命令行窗口 -t=false, --tty=false 分配一個偽終端 -i=false, --interactive=false 附着標准輸入到當前命令行
$ sudo docker run -a=[stdin, stdout] -i -t ubuntu /bin/bash 但是當通過管道同容器進行交互時,就不需要使用-t參數,例如下面的命令: echo test | docker run -i busybox cat
===================== 容器識別 如果你在執行docker run時沒有指定--name,那么deamon會自動生成一個隨機字符串UUID。 但是對於一個容器來說有個name會非常方便,當你需要連接其它容器時或者類似需要區分其它容器時,使用容器名稱可以簡化操作。無論容器運行在前台或者后台,這個名字都是有效的。 --cidfile="": Write the container ID to the file
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE ubuntu jdk8 ed479b562041 28 hours ago 799.3 MB ubuntu 14.04 d2a0ecffe6fa 10 days ago 188.4 MB
--ipc="" : Set the IPC mode for the container, 'container:<name|id>': reuses another container's IPC namespace 'host': use the host's IPC namespace inside the container 共享內存一般用在數據庫和高性能應用(C/OpenMPI、C++/using boost libraries)上或者金融服務上。 如果需要容器中部署上述類型的應用,那么就應該在多個容器直接使用共享內存了。
================ Network settings --dns=[] : Set custom dns servers for the container --net="bridge" : Set the Network mode for the container ##在docker橋接上,為容器創建一個新的網絡棧 'bridge' : creates a new network stack for the container on the docker bridge 'none' : no networking for this container 沒有為該容器配置網絡 'container:<name|id>' : reuses another container network stack 重用另一個容器的網絡棧 'host' : use the host network stack inside the container 在容器內使用主機的網絡棧 --add-host="" : Add a line to /etc/hosts (host:IP) 向容器/etc/hosts的文件中增加一行 --mac-address="" : Sets the container's Ethernet device's MAC address 設置容器網卡的MAC地址
默認情況下,容器使用主機的DNS設置,你也可以通過--dns來覆蓋容器內的DNS設置。 同時Docker為容器默認生成一個MAC地址,你可以通過--mac-address 12:34:56:78:9a:bc來設置你自己的MAC地址。
None模式 這個容器內部只會有一個loopback接口,而且不存在任何可以訪問外部網絡的router。 此時在主機上面將會存在一個docker0的網絡接口,同時會針對容器創建一對veth接口。 其中一個veth接口是在主機充當網卡橋接作用,另外一個veth接口存在於容器的命名空間中,並且指向容器的loopback。 Docker會自動給這個容器分配一個IP,並且將容器內的數據通過橋接轉發到外部。 host所有的網絡接口將完全對容器開放。 容器的主機名也會存在於主機的hostname中。 這時,容器所有對外暴露的端口和對其它容器的連接,將完全失效。 如果另外一個容器需要復用這個網絡堆棧, 則需要如下操作: $ sudo docker run -d --name redis example/redis --bind 127.0.0.1
#use the redis container's network stack to access localhost $ sudo docker run --rm -ti --net container:redis example/redis-cli -h 127.0.0.1 $ /docker run -ti --add-host db-static:86.75.30.9 ubuntu cat /etc/hosts 172.17.0.22 09d03f76bf2c fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback 86.75.30.9 db-static ##容器啟動時添加進來的 地址到主機名映射
================= Clean up (--rm)
另外一方面,你也可以保存容器所產生的數據。 但是當你僅僅需要短暫的運行一個容器,並且這些數據不需要保存,你可能就希望Docker能在容器結束時自動清理其所產生的數據。 --rm=false: Automatically remove the container when it exits (incompatible with -d)
Security configuration --security-opt="label:user:USER" : Set the label user for the container --security-opt="label:role:ROLE" : Set the label role for the container --security-opt="label:type:TYPE" : Set the label type for the container --security-opt="label:level:LEVEL" : Set the label level for the container --security-opt="label:disable" : Turn off label confinement for the container 關閉容器的標簽限制 --secutity-opt="apparmor:PROFILE" : Set the apparmor profile to be applied to the container 比如說,對於一個MLS系統來說(譯者注:MLS應該是指Multiple Listing System),你可以指定MCS/MLS級別。 使用下面的命令可以在不同的容器間分享內容: #docker run --security-opt=label:level:s0:c100,c200 -i -t fedora bash
#docker run --security-opt=label:level:TopSecret -i -t rhel7 bash
#docker run --security-opt=label:disable -i -t fedora bash
#docker run --security-opt=label:type:svirt_apache_t -i -t centos bash
Runtime constraints on CPU and memory -m="" : Memory limit (format: <number><optional unit>, where unit = b, k, m or g) -c=0 : CPU shares (relative weight)
如果主機支持swap內存,那么使用-m可以設定比主機物理內存還大的值。 默認情況下,所有的容器擁有相同的CPU優先級和CPU調度周期,但你可以通過Docker來通知內核給予某個或某幾個容器更多的CPU計算周期。 這時,C0、C1、C2可以100%的使用CPU資源(1024),但C3只能使用50%的CPU資源(512) 如果這個主機的操作系統是時序調度類型的,每個CPU時間片是100微秒,那么C0、C1、 C2將完全使用掉這100微秒,而C3只能使用50微秒。
Runtime privilege, Linux capabilities, and LXC configuration --cap-add : Add Linux capabilities --cap-drop : Drop Linux capabilities --privileged=false : Give extended privileges to this container --device=[] : Allows you to run devices inside the container without the --privileged flag. --lxc-conf=[] : (lxc exec-driver only) Add custom lxc options --lxc-conf="lxc.cgroup.cpuset.cpus = 0,1"
sudo docker run --device=/dev/snd:/dev/snd ...
$sudo docker run --device=/dev/sda:/dev/xvdc --rm -it ubuntu fdisk /dev/xvdc
Command (m for help): q
$sudo docker run --device=/dev/sda:/dev/xvdc:r --rm -it ubuntu fdisk /dev/xvdc You will not be able to write the partition table.
Command (m for help): q
$sudo docker run --device=/dev/sda:/dev/xvdc:w --rm -it ubuntu fdisk /dev/xvdc crash....
$sudo docker run --device=/dev/sda:/dev/xvdc:m --rm -it ubuntu fdisk /dev/xvdc fdisk: unable to open /dev/xvdc: Operation not permitted
使用--cap-add和--cap-drop,配合--privileged,你可以更細致的控制人哦怒氣。 默認使用這兩個參數的情況下,容器擁有一系列的內核修改權限,這兩個參數都支持all值,如果你想讓某個容器擁有除了MKNOD之外的所有內核權限,那么可以執行下面的命令: $ sudo docker run --cap-add=ALL --cap-drop=MKNOD ...
$ docker run -t -i --rm ubuntu:14.04 ip link add dummy0 type dummy RTNETLINK answers: Operation not permitted $ docker run -t -i --rm --cap-add=NET_ADMIN ubuntu:14.04 ip link add dummy0 type dummy
如果Docker守護進程在啟動時選擇了lxclxc-driver(docker -d --exec-driver=lxc),那么就可以使用--lxc-conf來設定LXC參數。 但需要注意的是,未來主機上的Docker deamon有可能不會使用LXC,所以這些參數有可能會包含一些沒有實現的配置功能。 這意味着,用戶在操作這些參數時必須要十分熟悉LXC。 比如說,你使用--lxc-conf修改了容器的IP地址,那么在/etc/hosts里面是不會自動體現的,需要你自行維護。
##把當前用戶加入到docker用戶組中 sudo usermod -a -G docker $USER
=============================== asn@hadoop1:~/Desktop$ docker commit -h
Usage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
Create a new image from a container's changes ##從一個容器的改變創建一個新的鏡像
-a, --author= Author (e.g., "John Hannibal Smith <hannibal@a-team.com>") -c, --change=[] Apply Dockerfile instruction to the created image --help=false Print usage -m, --message= Commit message -p, --pause=true Pause container during commit
============================ asn@hadoop1:~/hadoop-2.6.0-cdh5.4.4$ docker tag -h
Usage: docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
Tag an image into a repository ##給鏡像打標簽入庫
-f, --force=false Force --help=false Print usage
給容器打標簽 docker tag 11662b14f5e0 ubuntu:jdk1.7
以用戶grid_hd登錄容器 asn@hadoop1:~/hadoop-2.6.0-cdh5.4.4$ docker run -it -u grid_hd ubuntu:hd-salve1 grid_hd@c6af61c80d27:/$
查看目錄的大小 root@hadoop1:~# sudo du -sh /var/lib/docker 3.7G /var/lib/docker
給目錄下的所有子目錄增加執行權限 #!/bin/bash
find /mnt/sda4/docker/aufs -type d | while read dir do chmod +rx "$dir" done
find 目錄 -type f -name "docker*" ##在指定目錄下,查找名字模式為"docker*"的文件 find 目錄 -type d -name "sac*" ##在指定目錄下,查找名字模式為"sac*"的子目錄
啟動一個docker容器在后台運行 docker run -d IMAGE[:TAG] 命令 docker logs container_id ##打印該容器的輸出
docker attach container_id ##附加該容器的標准輸出到當前命令行
此時,Ctrl+C退出container(容器消失),按ctrl-p ctrl-q可以退出到宿主機,而保持container仍然在運行
發布容器的一個端口到主機 docker run -p
-p, --publish=[] Publish a container's port(s) to the host
-v, --volume=[] Bind mount a volume
docker images顯示鏡像 grid_hd@hadoop1:~/Desktop$ docker images --help
Usage: docker images [OPTIONS] [REPOSITORY]
List images
-a, --all=false Show all images (default hides intermediate images) --digests=false Show digests -f, --filter=[] Filter output based on conditions provided ##基於的條件過濾輸出 --help=false Print usage --no-trunc=false Don't truncate output -q, --quiet=false Only show numeric IDs ##僅顯示鏡像ID
docker rmi刪除鏡像 grid_hd@hadoop1:~/Desktop$ docker rmi --help
Usage: docker rmi [OPTIONS] IMAGE [IMAGE...]
Remove one or more images
-f, --force=false Force removal of the image --help=false Print usage --no-prune=false Do not delete untagged parents
docker rm 刪除正在運行的容器 grid_hd@hadoop1:~/Desktop$ docker rm --help
Usage: docker rm [OPTIONS] CONTAINER [CONTAINER...]
Remove one or more containers
-f, --force=false Force the removal of a running container (uses SIGKILL) --help=false Print usage -l, --link=false Remove the specified link -v, --volumes=false Remove the volumes associated with the container
清除系統中正在運行的容器腳本
docker ps 顯示所有和剛運行的容器 grid_hd@hadoop1:~/Desktop$ docker ps --help
Usage: docker ps [OPTIONS]
List containers
-a, --all=false Show all containers (default shows just running) --before= Show only container created before Id or Name -f, --filter=[] Filter output based on conditions provided --help=false Print usage -l, --latest=false Show the latest created container, include non-running ##顯示最近創建的容器(包括未運行的) -n=-1 Show n last created containers, include non-running ##顯示最近創建的n個容器(包括未運行的) --no-trunc=false Don't truncate output -q, --quiet=false Only display numeric IDs -s, --size=false Display total file sizes --since= Show created since Id or Name, include non-running
映射host到container的端口和目錄 映射主機到容器的端口是很有用的,比如在container中運行memcached,端口為11211,運行容器的host可以連接container的 internel_ip:11211 訪問,如果有從其他主機訪問memcached需求那就可以通過-p選項,形如-p <host_port:contain_port>,存在以下幾種寫法: 目錄映射其實是"綁定掛載"host的路徑到container的目錄,這對於內外傳送文件比較方便,在搭建私服那一節,為了避免私服container停止以后保存的images不被刪除,就要把提交的images保存到掛載的主機目錄下。使用比較簡單,-v <host_path:container_path>,綁定多個目錄時再加-v。 另外在兩個container之間建立聯系可用--link,詳見高級部分或官方文檔。 在主機的/tmp/docker下建立index.html,就可以通過http://localhost:80/或http://host-ip:80訪問了。
將一個container固化為一個新的image(commit) 當我們在制作自己的鏡像的時候,會在container中安裝一些工具、修改配置,如果不做commit保存起來,那么container停止以后再啟動,這些更改就消失了。
-a "seanlook7@gmail.com" commit container只會pause住容器,這是為了保證容器文件系統的一致性,但不會stop。如果你要對這個容器繼續做其他修改:
雖然產生了一個新的image,並且你可以看到大小有100MB,但從commit過程很快就可以知道實際上它並沒有獨立占用100MB的硬盤空間,而只是在舊鏡像的基礎上修改,它們共享大部分公共的"片"。
root@1ed046828345:/# mount none on / type aufs (rw,relatime,si=20f4f613261c7d1d,dio,dirperm1) proc on /proc type proc (rw,nosuid,nodev,noexec,relatime) tmpfs on /dev type tmpfs (rw,nosuid,mode=755) devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=666) shm on /dev/shm type tmpfs (rw,nosuid,nodev,noexec,relatime,size=65536k) mqueue on /dev/mqueue type mqueue (rw,nosuid,nodev,noexec,relatime) sysfs on /sys type sysfs (ro,nosuid,nodev,noexec,relatime) /dev/disk/by-uuid/cb3e8593-916d-40e3-8614-24741433f32f on /etc/resolv.conf type ext4 (rw,relatime,errors=remount-ro,data=ordered) /dev/disk/by-uuid/cb3e8593-916d-40e3-8614-24741433f32f on /etc/hostname type ext4 (rw,relatime,errors=remount-ro,data=ordered) /dev/disk/by-uuid/cb3e8593-916d-40e3-8614-24741433f32f on /etc/hosts type ext4 (rw,relatime,errors=remount-ro,data=ordered) devpts on /dev/console type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000) proc on /proc/asound type proc (ro,nosuid,nodev,noexec,relatime) proc on /proc/bus type proc (ro,nosuid,nodev,noexec,relatime) proc on /proc/fs type proc (ro,nosuid,nodev,noexec,relatime) proc on /proc/irq type proc (ro,nosuid,nodev,noexec,relatime) proc on /proc/sys type proc (ro,nosuid,nodev,noexec,relatime) proc on /proc/sysrq-trigger type proc (ro,nosuid,nodev,noexec,relatime) tmpfs on /proc/kcore type tmpfs (rw,nosuid,mode=755) tmpfs on /proc/timer_stats type tmpfs (rw,nosuid,mode=755)
有四種不同的選項會影響容器守護進程的服務名稱。
這種方式是寫到/etc/hostname ,以及/etc/hosts 文件中,作為容器主機IP的別名,並且將顯示在容器的bash中。 不過這種方式設置的主機名將不容易被容器之外可見。這將不會出現在 docker ps 或者 其他的容器的/etc/hosts 文件中。
這使得新容器的內部進程可以訪問主機名為ALIAS的容器而不用知道它的IP。 --link= 關於這個選項的詳細討論請看: Communication between containers.
3. --dns=IP_ADDRESS --設置DNS服務器的IP地址,寫入到容器的/etc/resolv.conf文件中。當容器中的進程嘗試訪問不在/etc/hosts文件中的主機A 時,容器將以53端口連接到IP_ADDRESS這個DNS服務器去搜尋主機A的IP地址。 4. --dns-search=DOMAIN --設置DNS服務器的搜索域,以防容器嘗試訪問不完整的主機名時從中檢索相應的IP。這是寫入到容器的 /etc/resolv.conf文件中的。當容器嘗試訪問主機 host,而DNS搜索域被設置為 example.com ,那么DNS將不僅去查尋host主機的IP,還去查詢host.example.com的 IP。 在docker中,如果啟動容器時缺少以上最后兩種選項設置時,將使得容器的/etc/resolv.conf文件看起來和宿主主機的/etc/resolv.conf文件一致。這些選項將修改默認的設置。
================================= 3、關於docker容器的端口映射 所以需要每次啟動容器時, 由docker程序自動添加NAT規則,前期盡可能的把需要映射的端口在創建容器時配置好,如下:
#此處我把mysql,redis,nginx,ssh都進行了映射 docker run -h="activemq" --name activemq -d -p 51000:22 -p 51001:3306-p 51003:6379 -p 51004:6381 -p 51005:80-p 51006:8000 -p 51007:8888 debian/base/etc/rc.local
4、關於docker容器的多程序開機自動運行docker容器每次啟動時,開機自啟動的命令都要在啟動容器前指定。 如 docker run -I -t debian /bin/bash命令,只會運行/bin/bash程序,其它的程序都不會運行,對於要跑多個程序的容器特別糾結。 注意:run命令是創建一個新的容器,如果要啟動一個曾經運行過的容器,則用命令docker ps -a中找對應的容器ID,然后使用docker start <容器ID>即可。
5、關於docker容器和鏡像的關系 這是因為Docker從父鏡像建立增量鏡像,只存儲每個容器的更改。 因此,如果你有一個300MB的父鏡像,如果你在容器中安裝了50MB的額外應用或服務,你的容器只有50MB,父鏡像還是300MB。 FROM ubuntu/testa #這是基礎鏡像 CMD["/root/start.sh"] #這是啟動命令
root@yangrong:/data# docker build -t <新鏡像名> ./
6、docker參數詳解
#從container中拷貝文件,當container已經關閉后,在里面的文件還可以拷貝出來。
一些網絡配置命令選項只能在啟動時提供給Docker服務器,並且在運行中不能改變:
有兩個網絡配置選項可以在啟動時或調用docker run時設置。當在啟動時設置它會成為docker run的默認值:
最后,一些網絡配置選項只能在調用docker run時指出,因為它們要為每個容器做特定的配置:
接下來的部分會對以上話題從易到難做出逐一解答。
【Shell腳本】逐行處理文本文件
經常會對文體文件進行逐行處理,在Shell里面如何獲取每行數據,然后處理該行數據,最后讀取下一行數據,循環處理.有多種解決方法如下:
1.通過read命令完成.
read命令接收標准輸入,或其他文件描述符的輸入,得到輸入后,read命令將數據放入一個標准變量中.
利用read讀取文件時,每次調用read命令都會讀取文件中的"一行"文本.
當文件沒有可讀的行時,read命令將以非零狀態退出.
1 cat data.dat | while read line
2 do
3 echo "File:${line}"
4 done
5
6 while read line
7 do
8 echo "File:${line}"
9 done < data.dat
2.使用awk命令完成
awk是一種優良的文本處理工具,提供了極其強大的功能.
利用awk讀取文件中的每行數據,並且可以對每行數據做一些處理,還可以單獨處理每行數據里的每列數據.
1 cat data.dat | awk '{print $0}'
2 cat data.dat | awk 'for(i=2;i<NF;i++) {printf $i} printf "\n"}'
第1行代碼輸出data.dat里的每行數據,第2代碼輸出每行中從第2列之后的數據.
如果是單純的數據或文本文件的按行讀取和顯示的話,使用awk命令比較方便.
3.使用for var in file 命令完成
for var in file 表示變量var在file中循環取值.取值的分隔符由$IFS確定.
1 for line in $(cat data.dat)
2 do
3 echo "File:${line}"
4 done
5
6 for line in `cat data.dat`
7 do
8 echo "File:${line}"
9 done
如果輸入文本每行中沒有空格,則line在輸入文本中按換行符分隔符循環取值.
如果輸入文本中包括空格或制表符,則不是換行讀取,line在輸入文本中按空格分隔符或制表符或換行符特環取值.
可以通過把IFS設置為換行符來達到逐行讀取的功能.
IFS的默認值為:空白(包括:空格,制表符,換行符).
ubuntu目錄結構本文引自:cup
/:根目錄,一般根目錄下只存放目錄,不要存放文件,/etc、/bin、/dev、/lib、/sbin應該和根目錄放置在一個分區中
/bin: /usr/bin: 可執行二進制文件的目錄,如常用的命令ls、tar、mv、cat等。 /boot: 放置linux系統啟動時用到的一些文件。/boot/vmlinuz為linux的內核文件,以及/boot/gurb。建議單獨分區,分區大小100M即可 /dev: 存放linux系統下的設備文件,訪問該目錄下某個文件,相當於訪問某個設備,常用的是掛載光驅mount /dev/cdrom /mnt。 /etc: 系統配置文件存放的目錄,不建議在此目錄下存放可執行文件,重要的配置文件有/etc/inittab、/etc/fstab、/etc/init.d、/etc/X11、/etc/sysconfig、/etc/xinetd.d修改配置文件之前記得備份。 注:/etc/X11存放與x windows有關的設置。 /home:系統默認的用戶家目錄,新增用戶賬號時,用戶的家目錄都存放在此目錄下,~表示當前用戶的家目錄,~test表示用戶test的家目錄。 建議單獨分區,並設置較大的磁盤空間,方便用戶存放數據
/lib: /usr/lib: /usr/local/lib: 系統使用的函數庫的目錄,程序在執行過程中,需要調用一些額外的參數時需要函數庫的協助,比較重要的目錄為/lib/modules。
/lost+fount: 系統異常產生錯誤時,會將一些遺失的片段放置於此目錄下,通常這個目錄會自動出現在裝置目錄下。如加載硬盤於/disk 中,此目錄下就會自動產生目錄/disk/lost+found /mnt:/media: 光盤默認掛載點,通常光盤掛載於/mnt/cdrom下,也不一定,可以選擇任意位置進行掛載。 /opt: 給主機額外安裝軟件所擺放的目錄。 如:FC4使用的Fedora 社群開發軟件,如果想要自行安裝新的KDE 桌面軟件,可以將該軟件安裝在該目錄下。以前的 Linux 系統中,習慣放置在 /usr/local 目錄下
/proc: 此目錄的數據都在內存中,如系統核心,外部設備,網絡狀態,由於數據都存放於內存中,所以不占用磁盤空間,比較重要的目錄有/proc/cpuinfo、/proc/interrupts、/proc/dma、/proc/ioports、/proc/net/*等
/root: 系統管理員root的家目錄,系統第一個啟動的分區為/,所以最好將/root和/放置在一個分區下。
/sbin: /usr/sbin: /usr/local/sbin:放置系統管理員使用的可執行命令,如fdisk、shutdown、mount等。與/bin不同的是,這幾個目錄是給系統管理員root使用的命令,一般用戶只能"查看"而不能設置和使用。
/tmp: 一般用戶或正在執行的程序臨時存放文件的目錄,任何人都可以訪問,重要數據不可放置在此目錄下 /srv: 服務啟動之后需要訪問的數據目錄,如www服務需要訪問的網頁數據存放在/srv/www內
/usr:應用程序存放目錄 /usr/bin 存放應用程序 /usr/share 存放共享數據 /usr/lib 存放不能直接運行的,卻是許多程序運行所必需的一些函數庫文件。 /usr/local: 存放軟件升級包 /usr/share/doc: 系統說明文件存放目錄。 /usr/share/man: 程序說明文件存放目錄,使用 man ls時會查詢/usr/share/man/man1/ls.1.gz的內容 建議單獨分區,設置較大的磁盤空間
/var: 放置系統執行過程中經常變化的文件,如隨時更改的日志文件/var/log /var/log/message: 所有的登錄文件存放目錄 /var/spool/mail: 郵件存放的目錄 /var/run: 程序或服務啟動后,其PID存放在該目錄下。 建議單獨分區,設置較大的磁盤空間 |