Shell cơ bản – Linux Shell là trình thông dịch dòng lệnh hoặc shell cung cấp giao diện người dùng dòng lệnh cho các hệ điều hành. Shell này vừa là ngôn ngữ lệnh tương tác vừa là ngôn ngữ script và được hệ điều hành sử dụng để kiểm soát việc thực thi hệ thống bằng cách sử dụng shell script.
Bài 1 mình đã giới thiệu cho các bạn về phần cứng và sự tương thích phần cứng trong Linux. Bài viết hôm nay mình sẽ giúp các bạn hiểu một số lệnh cơ bản nhất trong Linux Shell.
Lệnh liên quan đến thông tin kernel
Kiểm tra shell hiện tại:
$ echo $SHELL
/bin/bash
Kiểm tra phiên bản của Linux shell:
$ echo $BASH_VERSION
4.2.46(2)-release
Để xem tên của kernel:
$ uname
Linux
Xem phiên bản của kernel:
$ uname -r
3.10.0-1160.62.1.el7.x86_64
Trong bash shell có một số ký tự có ý nghĩa đặc biệt:
* ? [ ] ' " \ $ ; & ( ) | ^ < >
Giả khi gõ dấu ($
) với một chuỗi theo sau, chương trình sẽ cố gắng truy xuất giá trị của biến và hiển thị nó. Ví dụ:
$ echo It cost $1.00
It cost .00
Ở đây, Linux sẽ coi $1
là biến và cố gắng lấy giá trị của nó, tuy nhiên $1
không phải là biến và ta chưa từng khai báo nó, nên $1
sẽ không có giá trị và chỉ hiển thị .00
.
Nếu cần hiển thị đúng giá trị “$1” thì chỉ cần thêm dấu “\” phía trước:
$ echo Is Schrodinger\'s cat alive or dead\?
Is Schrodinger's cat alive or dead?
Lệnh điều hướng
Các tệp trong Linux được lưu trữ trong một cấu trúc thư mục duy nhất gọi là thư mục ảo. Thư mục ảo này chứa các tệp từ tất cả các thiết bị lưu trữ của máy tính và hợp chúng lại thành một cấu trúc duy nhất. Cấu trúc này có một thư mục cơ sở gọi là thư mục gốc (root).
Khi đăng nhập vào Linux, thư mục mặc định để làm việc hiện tại chính là thư mục chính user của bạn. Nó giống như căn phòng của bạn trong một căn nhà lớn.
Ta có thể điều hướng qua thư mục khác thông qua lệnh cd
. Lệnh cd
di chuyển thư mục làm việc sang vị trí mới. Lệnh pwd
dùng để hiển thị đường dẫn thư mục hiện tại.
$ pwd
/home/root
Thử chuyển sang thư mục /etc:
$ cd /etc
$ pwd
/etc
Khi sử dụng lệnh cd
, bạn có thể sử dụng tham chiếu thư mục tương đối hoặc tuyệt đối. Tham chiếu thư mục tuyệt đối luôn bắt đầu bằng dấu gạch chéo (/
) và sử dụng tên đầy đủ của vị trí thư mục.
$ cd /etc/root
Dấu (..
) dùng để di chuyển tương đối. Nó biểu thị thư mục cha của thư mục hiện tại.
$ cd ..
$ pwd
/etc
Ở ví dụ trên, giả sử ta đang ở thư mục /etc/root
. Khi gõ cd ..
thì thư mục hiện tại sẽ trở thành /etc
.
Để trở về thư mục mặc định (tức là thư mục user), dùng một trong các câu lệnh sau:
$ cd
$ cd ~
$ cd $home
Để kiểm tra xem một lệnh là lệnh internal hay external, sử dụng type
. Nếu kết quả trả về “is a shell builtin” thì tức là lệnh internal. Ngược lại là lệnh external.
$ type pwd
pwd is a shell builtin
$ type uname
uname is hashed (/usr/bin/uname)
Sử dụng biến môi trường
Biến môi trường là những biến dùng để theo dõi thông tin hệ thống cụ thể, như tên của người dùng đã đăng nhập vào shell, thư mục chính mặc định, đường dẫn tìm kiếm mà shell sử dụng, …
Một số biến môi trường phổ biến:
- BASH_VERSION: phiên bản của bash shell hiện tại
- EDITOR: trình soạn thảo lệnh mặc định
- GROUPS: nhóm của user
- HISTFILE: tên của file lịch sử lệnh của user
- HOME: đường dẫn thư mục mặc định của user
- HOSTNAME: hostname của hệ thống
- LANG: ngôn ngữ của shell
- PATH: danh sách thư mục được phân cách bằng dấu hai chấm để tìm kiếm lệnh
- PWD: thư mục đang làm việc hiện tại của user
- SHLVL: cấp độ của shell hiện tại
- TZ: timezone (nếu khác với timezone của hệ thống)
- UID: mã số định danh của user
Dùng lệnh set
để xem tất cả các biến môi trường đang active:
$ set
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:histappend:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="2" [2]="46" [3]="2" [4]="release" [5]="x86_64-redhat-linux-gnu")
BASH_VERSION='4.2.46(2)-release'
COLUMNS=80
DIRSTACK=()
EUID=1000
GROUPS=()
HISTCONTROL=ignoredups
HISTFILE=/home/datptt/.bash_history
HISTFILESIZE=1000
HISTSIZE=1000
HOME=/home/datptt
HOSTNAME=graylog
HOSTTYPE=x86_64
IFS=$' \t\n'
LANG=en_US.UTF-8
LESSOPEN='||/usr/bin/lesspipe.sh %s'
LINES=24
...
Để xem giá trị của biến môi trường, ta làm như sau: %n@%m %1~ %#
$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:
Gán giá trị cho biến môi trường
Để chỉnh sửa biến môi trường, cách đơn giản nhất là chỉnh sửa nó trong terminal. Ta chỉ cần gõ tên biến, theo sau nó là dấu bằng (=) và giá trị của biến đó.
$ PS1="My new prompt: "
My new prompt:
Tuy nhiên, đôi khi chúng ta có thể gặp lỗi nếu sử dụng cách trên để thay đổi biến môi trường. Ví dụ với biến PS1 – PS (Prompt Statement) sử dụng để tùy chỉnh chuỗi nhắc để hiển thị thông tin bạn muốn. Thay đổi sẽ không có tác dụng khi đi vào subshell (subshell được tạo ra khi bạn thực thi một script nào đó hoặc chạy một câu lệnh nào đó).
Ở ví dụ bên dưới, hãy để ý giá trị của biến $SHLVL
. Giá trị là 1 có nghĩa là trạng thái không phải đang ở subshell, còn giá trị lớn hơn 1 thì ngược lại – đang ở subshell. Lúc chưa ở subshell, giá trị của PS1
là “My new prompt: “, nhưng khi đi vào subshell, giá trị PS1
lại trở về như ban đầu.
$ PS1="My new prompt: "
My new prompt: echo $SHLVL
1
$ echo $PS1
$
$ echo $SHLVL
2
$ exit
exit
My new prompt:
Để duy trì thay đổi, chúng ta cần phải export biến đó, giả sử:
$ export PS1="KeepPrompt: "
Xoá giá trị biến môi trường
Nếu muốn đưa giá trị của biến môi trường về rỗng (blank), ta sử dụng lệnh unset
,
$ unset $EDITOR
Lệnh giúp đỡ
Lệnh man
Khi sử dụng command line, đôi khi chúng ta quên cú pháp của một lệnh và không thể truy cập internet để tra cứu, sử dụng lệnh man
để hiển thị nhắc lệnh.
$ man uname
UNAME(1) General Commands Manual UNAME(1)
NAME
uname – Print operating system name
SYNOPSIS
uname [-amnprsv]
DESCRIPTION
The uname utility writes symbols representing one or more system
characteristics to the standard output.
The following options are available:
-a Behave as though all of the options -mnrsv were specified.
-m print the machine hardware name.
-n print the nodename (the nodename may be a name that the system is
known by to a communications network).
-p print the machine processor architecture name.
Nếu muốn tìm kiếm theo từ khoá cho trước, sử dụng thêm option -k
.
$ man -k passwd
chkpasswd(8) - verifies user password against various systems
firmwarepasswd(8) - tool for setting and removing firmware passwords on a system
htpasswd(1) - Manage user files for basic authentication
kpasswd(1) - Kerberos 5 password changing program
kpasswdd(8) - Kerberos 5 password changing server
ldappasswd(1) - change the password of an LDAP entry
passwd(1) - modify a user's password
passwd(5), master.passwd(5) - format of the password file
...
Lệnh history
Lệnh history dùng để tra cứu lại những lệnh vừa thực thi gần nhất./-
Khi chạy lệnh history
, mỗi câu lệnh sẽ tương ứng với một số thứ tự. Để thực thi nhanh lệnh nằm ở số thứ tự thứ 915, gõ:
$ !915
man -k passwd
passwd (1)
passwd (5)
...
Trong trường hợp lệnh history
không hoạt động thì có thể shell đang sử dụng không phải là bash shell. Cần gõ lệnh echo $SHELL
để kiểm tra. Nếu không xuất hiện /bin/bash
thì cần phải thay đổi shell mặc định của user (trình bày sau).
Để thực hiện lệnh sử dụng thường xuyên nhất, gõ !!
.
Tổng kết Linux Shell cơ bản
Toàn bộ kiến thức cần nắm được như sau:
- Sử dụng
echo $VAR
để hiển thị giá trị biến môi trường,unset $VAR
để gán giá trị rỗng cho biến môi trường. - Lệnh man dùng để xem cách sử dụng của một lệnh.
- Lệnh
history
dùng để xem lịch sử các lệnh đã thực thi. - Dùng
!!
để thực thi lệnh sử dụng thường xuyên nhất.
Các bạn có thể xem các lệnh khác ở An A-Z Index of the Linux command line: bash + utilities.