Computer >> Máy Tính >  >> Lập trình >> Lập trình BASH

Hướng dẫn của sysadmin về Bash

Mỗi giao dịch đều có một công cụ mà người thành thạo trong giao dịch đó sử dụng thường xuyên nhất. Đối với nhiều sysadmins, công cụ đó là vỏ của họ. Trên phần lớn Linux và các hệ thống giống Unix khác, trình bao mặc định là Bash.

Bash là một chương trình khá cũ - nó có nguồn gốc từ cuối những năm 1980 - nhưng nó được xây dựng trên các shell cũ hơn rất nhiều, như C shell (csh), có tuổi đời gần 10 năm. Vì khái niệm shell đã cũ nên có một lượng lớn kiến ​​thức phức tạp đang chờ được tiêu thụ để làm cho cuộc sống của bất kỳ anh chàng hoặc cô gái sysadmin nào trở nên dễ dàng hơn rất nhiều.

Hãy xem xét một số điều cơ bản.

Ai đã, tại một số điểm, vô tình chạy một lệnh dưới quyền root và gây ra một số loại vấn đề? giơ tay

Tôi khá chắc rằng nhiều người trong chúng ta đã từng là anh chàng hoặc cô gái đó tại một thời điểm. Rất đau đớn. Dưới đây là một số thủ thuật rất đơn giản để ngăn bạn đánh viên đá đó lần thứ hai.

Sử dụng bí danh

Trước tiên, hãy thiết lập bí danh cho các lệnh như mv rm trỏ tới mv -Irm -I . Điều này sẽ đảm bảo rằng đang chạy rm -f /boot ít nhất yêu cầu bạn xác nhận. Trong Red Hat Enterprise Linux, các bí danh này được thiết lập theo mặc định nếu bạn sử dụng tài khoản gốc.

Nếu bạn cũng muốn đặt những bí danh đó cho tài khoản người dùng bình thường của mình, chỉ cần thả hai dòng này vào một tệp có tên .bashrc trong thư mục chính của bạn (những bí danh này cũng sẽ hoạt động với sudo):

alias mv='mv -i'
alias rm='rm -i'

Làm nổi bật lời nhắc gốc của bạn

Một điều khác bạn có thể làm để ngăn ngừa rủi ro là đảm bảo rằng bạn biết khi nào bạn đang sử dụng tài khoản gốc. Tôi thường làm điều đó bằng cách làm cho lời nhắc gốc thực sự nổi bật so với lời nhắc mà tôi sử dụng cho công việc bình thường hàng ngày của mình.

Nếu bạn thả nội dung sau vào tệp .bashrc trong thư mục chính của root, bạn sẽ có lời nhắc root màu đỏ trên nền đen, làm rõ ràng rằng bạn (hoặc bất kỳ ai khác) nên thực hiện cẩn thận.

export PS1="\[$(tput bold)$(tput setab 0)$(tput setaf 1)\]\u@\h:\w # \[$(tput sgr0)\]"

Trên thực tế, bạn nên hạn chế đăng nhập root càng nhiều càng tốt và thay vào đó chạy phần lớn các lệnh sysadmin của bạn thông qua sudo, nhưng đó là một câu chuyện khác.

Sau khi thực hiện một số thủ thuật nhỏ để giúp ngăn chặn "tác dụng phụ không chủ ý" của việc sử dụng tài khoản gốc, hãy cùng xem xét một số điều tốt đẹp mà Bash có thể giúp bạn thực hiện trong công việc hàng ngày.

Kiểm soát lịch sử của bạn

Bạn có thể biết rằng khi nhấn phím Mũi tên lên trong Bash, bạn có thể xem và sử dụng lại tất cả (tốt, nhiều) lệnh trước đó của mình. Đó là vì những lệnh đó đã được lưu vào một tệp có tên .bash_history trong thư mục chính của bạn. Tệp lịch sử đó đi kèm với một loạt cài đặt và lệnh có thể rất hữu ích.

Trước tiên, bạn có thể xem toàn bộ lịch sử lệnh gần đây của mình bằng cách nhập history hoặc bạn có thể giới hạn nó ở 30 lệnh cuối cùng của mình bằng cách nhập history 30 . Nhưng đó là vani khá. Bạn có nhiều quyền kiểm soát hơn đối với những gì Bash lưu và cách nó lưu.

Ví dụ:nếu bạn thêm phần sau vào .bashrc của mình, bất kỳ lệnh nào bắt đầu bằng dấu cách sẽ không được lưu vào danh sách lịch sử:

HISTCONTROL=ignorespace

Điều này có thể hữu ích nếu bạn cần chuyển mật khẩu cho một lệnh ở dạng bản rõ. (Đúng, điều đó thật kinh khủng, nhưng nó vẫn xảy ra.)

Nếu bạn không muốn một lệnh được thực thi thường xuyên hiển thị trong lịch sử của mình, hãy sử dụng:

HISTCONTROL=ignorespace:erasedups

Với điều này, mỗi khi bạn sử dụng một lệnh, tất cả các lần xuất hiện trước đó của nó sẽ bị xóa khỏi tệp lịch sử và chỉ lệnh gọi cuối cùng được lưu vào danh sách lịch sử của bạn.

Một cài đặt lịch sử mà tôi đặc biệt thích là HISTTIMEFORMAT cài đặt. Điều này sẽ thêm trước tất cả các mục nhập trong tệp lịch sử của bạn với một dấu thời gian. Ví dụ, tôi sử dụng:

HISTTIMEFORMAT="%F %T  "

Khi tôi nhập history 5 , Tôi nhận được thông tin đầy đủ, tốt đẹp, như thế này:

1009  2018-06-11 22:34:38  cat /etc/hosts
1010  2018-06-11 22:34:40  echo $foo
1011  2018-06-11 22:34:42  echo $bar
1012  2018-06-11 22:34:44  ssh myhost
1013  2018-06-11 22:34:55  vim .bashrc

Điều đó làm cho việc duyệt qua lịch sử lệnh của tôi và tìm lịch sử lệnh mà tôi đã sử dụng hai ngày trước dễ dàng hơn rất nhiều để thiết lập đường hầm SSH đến phòng thí nghiệm tại nhà của tôi (mà tôi lại quên, lặp đi lặp lại…).

Các phương pháp hay nhất về Bash

Tôi sẽ kết thúc điều này với danh sách 11 phương pháp hay nhất (hoặc ít nhất là tốt, tôi không khẳng định tính toàn diện) khi viết tập lệnh Bash.

  1. Các tập lệnh bash có thể trở nên phức tạp và các bình luận rất rẻ. Nếu bạn băn khoăn có nên thêm bình luận hay không, hãy thêm bình luận. Nếu bạn trở về sau cuối tuần và phải dành thời gian tìm hiểu xem bạn đang cố gắng làm gì vào thứ Sáu tuần trước, bạn đã quên thêm nhận xét.

  1. Đặt tất cả các tên biến của bạn trong dấu ngoặc nhọn, như ${myvariable} . Việc tạo thói quen này khiến những thứ như ${variable}_suffix có thể và cải thiện tính nhất quán trong suốt các tập lệnh của bạn.
  1. Không sử dụng dấu gạch ngược khi đánh giá một biểu thức; sử dụng $() cú pháp thay thế. Vì vậy, hãy sử dụng:
    for  file in $(ls); do

    không

    for  file in `ls`; do

    Tùy chọn trước đây có thể lồng vào nhau, dễ đọc hơn và giữ cho dân số sysadmin chung luôn hài lòng. Không sử dụng dấu gạch ngược.

  1. Tính nhất quán là tốt. Chọn một phong cách làm việc và gắn bó với nó trong suốt kịch bản của bạn. Rõ ràng, tôi sẽ thích nếu mọi người chọn $() cú pháp trên dấu gạch ngược và bao bọc các biến của chúng trong dấu ngoặc nhọn. Tôi sẽ thích nó hơn nếu mọi người sử dụng hai hoặc bốn dấu cách — không phải tab — để thụt lề, nhưng ngay cả khi bạn chọn sai, hãy làm sai một cách nhất quán.
  1. Sử dụng shebang thích hợp cho tập lệnh Bash. Khi tôi đang viết các tập lệnh Bash với ý định chỉ thực thi chúng bằng Bash, tôi thường sử dụng #!/usr/bin/bash như shebang của tôi. Không sử dụng #!/bin/sh hoặc #!/usr/bin/sh . Tập lệnh của bạn sẽ thực thi, nhưng nó sẽ chạy ở chế độ tương thích — có thể có nhiều tác dụng phụ không mong muốn. (Tất nhiên, trừ khi chế độ tương thích là điều bạn muốn.)
  1. Khi so sánh các chuỗi, bạn nên trích dẫn các biến trong câu lệnh if, vì nếu biến của bạn trống, Bash sẽ tạo ra một lỗi cho các dòng như sau:
    if [ ${myvar} == "foo" ]; then
      echo "bar"
    fi

    Và sẽ đánh giá thành false cho một dòng như thế này:

    if [ "${myvar}" == "foo" ]; then
      echo "bar"
    fi  

    Ngoài ra, nếu bạn không chắc chắn về nội dung của một biến (ví dụ:khi bạn đang phân tích cú pháp đầu vào của người dùng), hãy trích dẫn các biến của bạn để ngăn việc diễn giải một số ký tự đặc biệt và đảm bảo rằng biến được coi là một từ duy nhất, ngay cả khi nó chứa khoảng trắng.

  1. Tôi đoán đây là vấn đề sở thích, nhưng tôi thích sử dụng dấu bằng kép hơn ( == ) ngay cả khi so sánh các chuỗi trong Bash. Đó là vấn đề về tính nhất quán và mặc dù — chỉ dành cho so sánh chuỗi — một dấu bằng duy nhất sẽ hoạt động, tâm trí của tôi ngay lập tức nghĩ rằng "dấu bằng duy nhất là một toán tử gán!"
  1. Sử dụng mã thoát thích hợp. Đảm bảo rằng nếu tập lệnh của bạn không thực hiện được điều gì đó, bạn sẽ hiển thị cho người dùng thông báo lỗi bằng văn bản (tốt nhất là kèm theo cách khắc phục sự cố) và gửi mã thoát khác 0:
    # we have failed
    echo "Process has failed to complete, you need to manually restart the whatchamacallit"
    exit 1
    theo cách thủ công

    Điều này giúp việc gọi tập lệnh của bạn theo chương trình từ một tập lệnh khác dễ dàng hơn và xác minh hoàn thành thành công tập lệnh đó.

  1. Sử dụng các cơ chế tích hợp của Bash để cung cấp các mặc định lành mạnh cho các biến của bạn hoặc tạo ra lỗi nếu các biến mà bạn mong đợi được xác định không được xác định:
    # this sets the value of $myvar to redhat, and prints 'redhat'
    echo ${myvar:=redhat}
    # this throws an error reading 'The variable myvar is undefined, dear reader' if $myvar is undefined
    ${myvar:?The variable myvar is undefined, dear reader}
  1. Đặc biệt nếu bạn đang viết một tập lệnh lớn và đặc biệt nếu bạn làm việc trên tập lệnh lớn đó với những người khác, hãy cân nhắc sử dụng local từ khóa khi xác định các biến bên trong hàm. local từ khóa sẽ tạo một biến cục bộ, đó là một biến chỉ hiển thị trong hàm đó. Điều này hạn chế khả năng xung đột các biến.
  1. Đôi khi mọi sysadmin đều phải làm điều đó:gỡ lỗi thứ gì đó trên bảng điều khiển, bảng điều khiển thực trong trung tâm dữ liệu hoặc ảo thông qua nền tảng ảo hóa. Nếu bạn phải gỡ lỗi tập lệnh theo cách đó, bạn sẽ cảm ơn bản thân vì đã ghi nhớ điều này:Không tạo các dòng trong tập lệnh của bạn quá dài!



    Trên nhiều hệ thống, chiều rộng mặc định của bảng điều khiển vẫn là 80 ký tự. Nếu bạn cần gỡ lỗi một tập lệnh trên bảng điều khiển và tập lệnh đó có những dòng rất dài, bạn sẽ là một chú gấu trúc buồn. Bên cạnh đó, một tập lệnh có các dòng ngắn hơn — mặc định vẫn là 80 ký tự — cũng dễ đọc và hiểu hơn rất nhiều trong một trình soạn thảo thông thường!

Tôi thực sự yêu Bash. Tôi có thể dành hàng giờ để viết về nó hoặc trao đổi những thủ thuật hay với những người cùng đam mê. Hãy chắc chắn rằng bạn bỏ mục yêu thích của mình trong phần bình luận!