paint-brush
Vệ sinh dòng lệnh kém? Xem xét Lịch sử vỏ chịu tảitừ tác giả@tylerjl
930 lượt đọc
930 lượt đọc

Vệ sinh dòng lệnh kém? Xem xét Lịch sử vỏ chịu tải

từ tác giả Tyler6m2022/07/22
Read on Terminal Reader
Read this story w/o Javascript

dài quá đọc không nổi

Khái niệm về lịch sử lệnh hoặc vỏ trong nghề nghiệp của chúng ta là một cơ chế bị đánh giá thấp sâu sắc. Nếu bạn có thể nhớ lại một vài chuỗi con từ các lệnh có thể trả lời các câu hỏi quan trọng trong công việc, bạn có toàn bộ lịch sử kinh nghiệm nghề nghiệp của mình trong tầm tay. Đây là cách tôi sử dụng lịch sử shell của mình như một khía cạnh quan trọng của kỹ thuật phần mềm.

Companies Mentioned

Mention Thumbnail
Mention Thumbnail
featured image - Vệ sinh dòng lệnh kém? Xem xét Lịch sử vỏ chịu tải
Tyler HackerNoon profile picture

Tôi vệ sinh dòng lệnh kém. Khi tôi mơ ước một đường ống hữu ích tồn tại, tôi rất hiếm khi cam kết nó với một cấu hình shell ở đâu đó. Đúng hơn, tôi để fzf nạo vét nó vào lúc nào đó sau này khi tôi cần. Các hàm của tôi không được ghi lại bằng tài liệu, có các tên và biến số rất ngắn vì tôi có xu hướng viết mã cho môn đánh gôn và cụ thể cho trường hợp sử dụng tại thời điểm chứ không phải chung chung.


Kể từ đó, tôi đã quyết định rằng đây là cách tiếp cận tối ưu.

Lấy lại tuyên bố đó, bạn đi lệch hướng

Không! Tôi thực sự tin vào điều này. Tôi có lý do.


Khái niệm về lịch sử lệnh hoặc vỏ trong nghề nghiệp của chúng ta là một cơ chế bị đánh giá thấp sâu sắc.


Hãy xem xét thực tế rằng - nếu bạn giữ lại tất cả lịch sử và thể hiện tất cả các nhiệm vụ hoạt động của mình dưới dạng lệnh đầu cuối - bạn có thể có toàn bộ lịch sử công việc của mình (ngoài các hiện vật mã hóa) trong vòng vài giây. Làm cách nào để tạo chứng chỉ x509 với openssl ? Cách dễ nhất để kiểm tra Spectre giữa một nhóm máy chủ là gì? Nếu bạn có thể nhớ lại một vài chuỗi con từ các lệnh có thể trả lời câu hỏi, thì việc tìm kiếm lịch sử có thể đưa bộ nhớ đã mất này vào đầu ngón tay của bạn để sử dụng lại ngay lập tức.


Hãy tưởng tượng làm thế nào một nghề khác có thể đánh giá cao kiểu nhớ lại tức thì, được lưu giữ vô hạn, không cần ghi lại mà chuyển thành một hành động có thể sử dụng được ngay lập tức. Một luật sư nộp một loại văn bản pháp lý cụ thể? Một giáo viên cho điểm một tập hợp các bài kiểm tra? Bạn có thể nghĩ nhiều hơn, nhưng quan điểm của tôi là khái niệm lịch sử shell ở giao điểm của công việc kỹ thuật phần mềm cổ cồn trắng có tiềm năng to lớn.


Đây là một ví dụ thực tế được lấy từ công việc của chính tôi. Trường hợp sử dụng của bạn có thể khác, nhưng một tình huống mà đôi khi tôi gặp phải là mở một phiên bản Vault cho máy chủ lưu trữ mà tôi đã gỡ xuống cho một cái gì đó như bản cập nhật hạt nhân. Vòng phản hồi trông giống như thế này:


  • À, tôi phải mở bản sao Vault này. Chìa khóa không dấu của tôi lại ở đâu?

    • Ồ đúng rồi, nó ở Bitwarden. Tôi có thể lấy nó bằng rbw :

       rbw get 'Vault Unseal Key'
  • Khỉ thật. Phiên bản nào cần được mở niêm phong?

    • Tôi đoán tôi có thể hỏi Lãnh sự:

       http :8500/v1/health/state/critical
    • Ồ. Tôi có thể lấy các nút đó dưới dạng danh sách các điểm cuối mà tôi có thể sử dụng với thứ khác không?

       http :8500/v1/health/state/critical \ | jq -r '.[].ServiceID' \ | awk -F: '{ print "http://" $2 ":" $3; }'

      Lưu ý : Đây là một ví dụ phụ , vì tôi không biết đường ống dẫn đó. Tôi bắt đầu với lệnh httpie , sau đó nhấn vào lệnh jq rồi lặp lại bộ lọc awk , chạy lệnh giữa các đường ống đã thêm để xem tôi nhận được gì ở giữa.

  • Được chứ. Tôi có khóa chưa được niêm phong và (các) điểm cuối cần được mở. Tôi có thể dán chúng lại với nhau bằng một vòng lặp zsh :

     http :8500/v1/health/state/critical \ | jq -r '.[].ServiceID' \ | awk -F: '{ print "http://" $2 ":" $3; }' \ | while read -rh do VAULT_HOST=$h vault operator unseal $(rbw get 'Vault Unseal Key') done

Lệnh cuối cùng ở đây rất khó hiểu. Không khó để biết cách bạn có thể dọn dẹp điều này và đặt nó vào một hàm hoặc tập lệnh shell được mã hóa gọn gàng: một biến cho khóa unseal Vault của tôi, một hàm để trích xuất danh sách các máy chủ được niêm phong, v.v.


Nhưng tôi làm kiểu viết kịch bản ngắn này rất nhiều . Và “số lượng đường ống nhỏ mà tôi viết thời gian cần thiết để biến chúng thành các tập lệnh shell tốt và tôi đưa vào đúng tệp và cam kết với số lượng repo dotfiles của tôi” sẽ thực sự không hề nhỏ. Vì vậy, tôi chỉ bỏ qua nó!


Tôi đã từng tự đánh giá về điều này. Tuy nhiên, trong suốt nhiều năm, số lần tôi tự đá mình vì không ghi lại nhiều đường ống của tôi trong một tập lệnh ở đâu đó so với lịch sử shell của tôi là rất ít đến không tồn tại.


Tôi thực sự có một sự hối tiếc lớn: khi tôi không mang chúng theo bên mình trên các máy trạm của mình. Nhưng bạn có biết rằng có những công cụ được thiết kế đặc biệt để giúp bạn mang theo lịch sử shell bên mình không? Đó không còn là một vấn đề lớn!


Vì vậy, điều gì sẽ xảy ra khi bạn tổng hợp các hành động lớn và đôi khi phức tạp trong lịch sử shell của mình, hãy thực hiện nó thường xuyên và để .shell_history của bạn phát triển thành một khu vườn xinh đẹp và đáng sợ?


Bạn có thể hoàn thành rất nhiều việc, và chi phí cho cả a) ghi lại các phím tắt đó và b) sử dụng chúng về cơ bản là không có ma sát. Với sức mạnh của một thứ như fzf trong tầm tay của bạn, toàn bộ lịch sử sự nghiệp chuyên nghiệp của bạn trong công việc dòng lệnh sẽ có sẵn ngay lập tức. Bạn không bị ràng buộc bởi những gì bạn cảm thấy đáng để vượt qua bất kỳ rào cản nào để ghi lại nó cho hậu thế. Mọi thứ đều ở đó, và bạn không cần phải suy nghĩ về việc ghi lại bất kỳ thứ gì trong số đó.


Ví dụ: Tôi đã không làm việc trực tiếp với các chỉ số S3 cấp thấp trong một thời gian dài. Nhưng tôi nhớ lại trước đây cần tổng hợp tổng lưu lượng truy cập thông qua một nhóm S3. Tôi có thể tìm thấy lệnh để trả lời câu hỏi đó cho bạn trong khoảng hai giây bằng cách gõ Ctrl-r aws s3 statistics <RET> :

 today="$(date +%s)" for bucket in $(aws s3 ls | awk '{ print $NF; }') do echo -n "$bucket " aws cloudwatch get-metric-statistics \ --namespace AWS/S3 \ --start-time "$(echo $today - 86400 | bc)" --end-time "$today" \ --period 86400 \ --statistics Average \ --region us-east-1 \ --metric-name BucketSizeBytes \ --dimensions Name=BucketName,Value=$bucket Name=StorageType,Value=StandardStorage \ | jq '.Datapoints[].Average' \ | gnumfmt --to=si done


Điều này có thể không được sử dụng 100% như được viết cho một nhiệm vụ tương tự vài năm sau, nhưng hãy đập Ctrl-x Ctrl-e đó, chỉnh sửa nhanh và tiếp tục. Không quá khó, và bạn có thể thấy tại sao việc gán điều này cho một thứ gì đó rất chính thức như một hàm shell lại không đáng phải bỏ ra. Khi đó, nó là cụ thể, nó cần được điều chỉnh ngay bây giờ và sử dụng nó trong bối cảnh này là một cách rất phù hợp để “lấy nó từ lịch sử của tôi và chỉnh sửa nó” .¹

tl; dr

Thử cái này:


  • Chỉnh sửa thiết lập lịch sử shell của bạn để giữ lại nhiều lịch sử. Thậm chí có thể thiết lập một cái gì đó như atuin để mang nó theo bạn mọi lúc mọi nơi (hoặc ít nhất là sử dụng tích hợp lịch sử của fzf để làm cho Ctrl-r của bạn tốt hơn)
  • Nếu bạn có thể, hãy thử thể hiện các nhiệm vụ hoặc đơn vị công việc trong các lệnh shell độc lập.² Điều này có nghĩa là các lệnh shell dài hơn và được xâu chuỗi lại với nhau nhiều hơn, nhưng điều đó không sao cả! Mục tiêu của bạn là dần dần tích lũy một thư viện các chương trình nhỏ có thể thay thế bất kỳ hành động nào của bạn mà có thể là thủ công.
  • Bản thân trong tương lai của bạn sẽ cảm ơn bản thân hiện tại khi bạn có thể sử dụng lại một lệnh thực hiện điều gì đó khó hoặc phức tạp với một vài lần nhấn phím.

Chú thích

¹ Tôi sẽ thừa nhận rằng các ví dụ như phân tích một chút trong tình huống đồng đội. Mặc dù tôi có thể tăng lưu lượng truy cập S3 của chúng tôi trong một giây, nhưng làm thế nào để bạn phân tán kiến thức và khả năng đó cho những người khác? Kho tài liệu và tập lệnh lớn có thể giải quyết vấn đề này, nhưng mục đích của tôi trong bài đăng này là hướng về thực tế rằng chi phí ma sát thấp và chi phí rào cản nhập cảnh thấp là điều làm nên lịch sử. Có thể có một cách hay để thực hiện điều đó và chia sẻ nhóm hoạt động song song.


² Có một bài đăng khác được chôn giấu ở đây về “công việc đầu tiên trên dòng lệnh”, nhưng cũng đủ để nhấn mạnh rằng tôi nghĩ rằng có những lợi ích tuyệt vời có được bằng cách hợp nhất càng nhiều công việc càng tốt vào dạng dòng lệnh. Các hành động dễ nhớ lại dưới dạng lịch sử vỏ là một lợi ích cùng với nhiều lợi ích khác như khả năng tương tác, khả năng lặp lại và hơn thế nữa.


Cũng được xuất bản ở đây .