Chào mọi người! Trong bài viết này, chúng ta sẽ xem xét kỹ dòng lệnh (còn được gọi là CLI, console, terminal hoặc shell).
Dòng lệnh là một trong những công cụ hữu ích và hiệu quả nhất mà chúng ta có với tư cách là nhà phát triển và người dùng máy tính nói chung. Tuy nhiên, việc sử dụng nó có thể hơi quá sức và phức tạp khi bạn mới bắt đầu.
Trong bài viết này, tôi sẽ cố gắng hết sức để giải thích một cách đơn giản các phần tạo nên giao diện dòng lệnh và những điều cơ bản về cách hoạt động của nó, vì vậy bạn có thể bắt đầu sử dụng nó cho các công việc hàng ngày của mình.
Đi nào! =D
Mục lục
- Sự khác biệt giữa bảng điều khiển, thiết bị đầu cuối, dòng lệnh (CLI) và Shell
- Bảng điều khiển
- Nhà ga
- Vỏ
- Dòng lệnh (CLI)
- Tại sao tôi nên quan tâm đến việc sử dụng thiết bị đầu cuối?
- Các loại vỏ khác nhau
- Một chút lịch sử - Posix
- Làm cách nào để biết tôi đang chạy trình bao nào?
- Vỏ nào tốt hơn?
- Nhận xét về khả năng tùy chỉnh
- Các lệnh phổ biến và hữu ích nhất để sử dụng
- Lệnh Git
- Tập lệnh đầu tiên của chúng tôi
- Làm tròn
Sự khác biệt giữa bảng điều khiển, dòng lệnh (CLI), thiết bị đầu cuối và Shell
Tôi nghĩ rằng một nơi tốt để bắt đầu là biết chính xác dòng lệnh là gì.
Khi đề cập đến điều này, bạn có thể đã nghe đến các thuật ngữ Terminal, console, command line, CLI và shell. Mọi người thường sử dụng những từ này thay thế cho nhau nhưng sự thật là chúng thực sự khác nhau.
Việc phân biệt từng thứ không phải là điều quan trọng cần thiết, nhưng nó sẽ giúp làm sáng tỏ mọi thứ. Vì vậy, hãy giải thích ngắn gọn từng điều.
Bảng điều khiển:
Bảng điều khiển là thiết bị vật lý cho phép bạn tương tác với máy tính.
Bằng tiếng Anh đơn giản, đó là màn hình máy tính, bàn phím và chuột của bạn. Với tư cách là người dùng, bạn tương tác với máy tính của mình thông qua bảng điều khiển của bạn.
Nhà ga:
Một thiết bị đầu cuối là một môi trường đầu vào và đầu ra văn bản. Đây là một chương trình hoạt động như một trình bao bọc và cho phép chúng tôi nhập các lệnh mà máy tính xử lý.
Nói lại bằng tiếng Anh đơn giản, đó là "cửa sổ" trong đó bạn nhập các lệnh thực tế mà máy tính của bạn sẽ xử lý.
Hãy nhớ rằng thiết bị đầu cuối là một chương trình, giống như bất kỳ chương trình nào khác. Và giống như bất kỳ chương trình nào, bạn có thể cài đặt và gỡ cài đặt tùy ý. Cũng có thể có nhiều thiết bị đầu cuối được cài đặt trong máy tính của bạn và chạy bất kỳ thiết bị nào bạn muốn bất cứ khi nào bạn muốn.
Tất cả các hệ điều hành đều được cài đặt một thiết bị đầu cuối mặc định, nhưng có nhiều tùy chọn ngoài đó để bạn lựa chọn, mỗi tùy chọn có các chức năng và tính năng riêng.
Shell:
Trình bao là một chương trình hoạt động như trình thông dịch dòng lệnh. Nó xử lý các lệnh và xuất ra kết quả . Nó diễn giải và xử lý các lệnh do người dùng nhập vào.
Giống như terminal, shell là một chương trình được cài đặt mặc định trong tất cả các hệ điều hành, nhưng người dùng cũng có thể cài đặt và gỡ cài đặt.
Các shell khác nhau cũng có cú pháp và đặc điểm khác nhau. Cũng có thể cài đặt nhiều shell trên máy tính của bạn và chạy từng shell bất cứ khi nào bạn muốn.
Trong hầu hết các hệ điều hành Linux và Mac, trình bao mặc định là Bash. Trong khi trên Windows, đó là Powershell. Một số ví dụ phổ biến khác về shell là Zsh và Fish.
Vỏ cũng hoạt động như ngôn ngữ lập trình , theo nghĩa là với chúng, chúng ta có thể tạo tập lệnh để làm cho máy tính của chúng ta thực thi một tác vụ nhất định. Tập lệnh chỉ là một chuỗi các hướng dẫn (lệnh) mà chúng ta có thể lưu vào một tệp và sau đó thực thi bất cứ khi nào chúng ta muốn.
Chúng ta sẽ xem xét các script ở phần sau trong bài viết này. Bây giờ, hãy nhớ rằng shell là chương trình mà máy tính của bạn sử dụng để "hiểu" và thực hiện các lệnh của bạn, đồng thời bạn cũng có thể sử dụng nó để lập trình các tác vụ.
Cũng nên nhớ rằng thiết bị đầu cuối là chương trình mà trình bao sẽ chạy. Nhưng cả hai chương trình đều độc lập. Điều đó có nghĩa là, tôi có thể chạy bất kỳ shell nào trên bất kỳ thiết bị đầu cuối nào. Theo nghĩa đó, không có sự phụ thuộc nào giữa cả hai chương trình.
Dòng lệnh hoặc CLI (giao diện dòng lệnh):
CLI là giao diện mà chúng ta nhập các lệnh để máy tính xử lý. Một lần nữa, bằng tiếng Anh đơn giản, đó là không gian mà bạn nhập các lệnh mà máy tính sẽ xử lý.
Điều này thực tế giống với thiết bị đầu cuối và theo ý kiến của tôi, các thuật ngữ này có thể được sử dụng thay thế cho nhau.
Một điều thú vị cần đề cập ở đây là hầu hết các hệ điều hành có hai loại giao diện khác nhau:
- CLI , nhận lệnh làm đầu vào để máy tính thực thi các tác vụ.
- Cái kia là GUI (giao diện người dùng đồ họa), trong đó người dùng có thể nhìn thấy mọi thứ trên màn hình và nhấp vào chúng và máy tính sẽ phản hồi các sự kiện đó bằng cách thực hiện tác vụ tương ứng.
Tại sao tôi nên quan tâm đến việc sử dụng thiết bị đầu cuối?
Chúng tôi vừa đề cập rằng hầu hết các hệ điều hành đều có GUI. Vì vậy, nếu chúng ta có thể nhìn thấy mọi thứ trên màn hình và nhấp vào xung quanh để làm bất cứ điều gì chúng ta muốn, bạn có thể tự hỏi tại sao bạn nên học thứ terminal / cli / shell phức tạp này?
Lý do đầu tiên là đối với nhiều tác vụ, nó chỉ hiệu quả hơn . Chúng ta sẽ thấy một số ví dụ sau một giây, nhưng có nhiều tác vụ trong đó GUI sẽ yêu cầu nhiều lần nhấp xung quanh các cửa sổ khác nhau. Nhưng trên CLI, các tác vụ này có thể được thực hiện bằng một lệnh duy nhất.
Theo nghĩa này, việc sử dụng thoải mái với dòng lệnh sẽ giúp bạn tiết kiệm thời gian và có thể thực hiện các tác vụ của mình nhanh hơn.
Lý do thứ hai là bằng cách sử dụng các lệnh, bạn có thể dễ dàng tự động hóa các tác vụ . Như đã đề cập trước đó, chúng ta có thể xây dựng các tập lệnh với shell của mình và sau đó thực thi các tập lệnh đó bất cứ khi nào chúng ta muốn. Điều này cực kỳ hữu ích khi giải quyết các công việc lặp đi lặp lại mà chúng ta không muốn làm đi làm lại.
Chỉ để đưa ra một số ví dụ, chúng tôi có thể xây dựng một tập lệnh tạo một repo trực tuyến mới cho chúng tôi hoặc tạo một cơ sở hạ tầng nhất định trên một nhà cung cấp đám mây cho chúng tôi hoặc thực hiện một tác vụ đơn giản hơn như thay đổi hình nền màn hình của chúng tôi mỗi giờ.
Viết kịch bản là một cách tuyệt vời để tiết kiệm thời gian với các tác vụ lặp đi lặp lại.
Lý do thứ ba là đôi khi CLI sẽ là cách duy nhất trong đó chúng tôi có thể tương tác với một máy tính. Lấy ví dụ, trường hợp bạn cần tương tác với một máy chủ nền tảng đám mây. Trong hầu hết các trường hợp này, bạn sẽ không có sẵn GUI mà chỉ có CLI để chạy các lệnh.
Vì vậy, việc thoải mái với CLI sẽ cho phép bạn tương tác với máy tính trên tất cả các lĩnh vực.
Lý do cuối cùng là nó trông bắt mắt và rất vui. Bạn không thấy các hacker phim đang nhấp chuột xung quanh máy tính của họ, phải không?;)
Các loại shell khác nhau
Trước khi đi sâu vào các lệnh thực tế bạn có thể chạy trong thiết bị đầu cuối của mình, tôi nghĩ điều quan trọng là phải nhận ra các loại trình bao khác nhau và cách xác định trình bao bạn hiện đang chạy.
Các trình bao khác nhau có cú pháp khác nhau và các tính năng khác nhau, vì vậy để biết chính xác lệnh nào cần nhập, trước tiên bạn cần biết mình đang chạy trình bao nào.
Một chút lịch sử - Posix
Đối với vỏ, có một tiêu chuẩn chung được gọi là Posix .
Posix hoạt động cho shell theo cách rất giống với ECMAScript hoạt động cho JavaScript. Đó là một tiêu chuẩn quy định các đặc điểm và tính năng nhất định mà tất cả các shell phải tuân thủ.
Tiêu chuẩn này đã được ổn định vào những năm 1980 và hầu hết các loại vỏ hiện tại đã được phát triển theo tiêu chuẩn đó. Đó là lý do tại sao hầu hết các shell chia sẻ cú pháp tương tự và các tính năng tương tự.
Làm cách nào để biết tôi đang chạy trình bao nào?
Để biết bạn hiện đang chạy shell nào, chỉ cần mở terminal của bạn và nhập echo $0
. Thao tác này sẽ in ra tên chương trình đang chạy hiện tại, trong trường hợp này là tên thực.
Vỏ nào tốt hơn?
Không có RẤT NHIỀU sự khác biệt giữa hầu hết các loại vỏ. Vì hầu hết chúng đều tuân thủ cùng một tiêu chuẩn, bạn sẽ thấy rằng hầu hết chúng đều hoạt động tương tự nhau.
Tuy nhiên, có một số khác biệt nhỏ mà bạn có thể muốn biết:
- Như đã đề cập, Bash được sử dụng rộng rãi nhất và được cài đặt theo mặc định trên Mac và Linux.
- Zsh rất giống với Bash, nhưng nó được tạo ra sau nó và đi kèm với một số cải tiến tốt đẹp trên nó. Nếu bạn muốn biết thêm chi tiết về sự khác biệt của nó, đây là một bài viết thú vị về nó.
- Cá là một trình bao thường được sử dụng khác đi kèm với một số tính năng và cấu hình tích hợp sẵn, chẳng hạn như tự động hoàn thành và tô sáng cú pháp. Vấn đề về Fish là nó không phải là lời phàn nàn của Posix, trong khi Bash và Zsh thì như vậy. Điều này có nghĩa là một số lệnh bạn sẽ có thể chạy trên Bash và Zsh sẽ không chạy trên Fish và viceversa. Điều này làm cho Fish scripting kém tương thích với hầu hết các máy tính so với Bash và Zsh.
- Ngoài ra còn có các lớp vỏ khác như Tro hoặc Dấu gạch ngang (Tôi biết, việc đặt tên chỉ làm cho mọi thứ trở nên khó hiểu hơn ...) đó là các phiên bản rút gọn của vỏ Posix. Điều này có nghĩa là họ chỉ cung cấp các tính năng được yêu cầu trong Posix và không có gì khác. Trong khi Bash và Zsh thêm nhiều tính năng hơn hơn những gì Posix yêu cầu.
Thực tế là các shell bổ sung thêm nhiều tính năng giúp chúng tương tác dễ dàng và thân thiện hơn, nhưng thực thi các tập lệnh và lệnh chậm hơn.
Vì vậy, một phương pháp phổ biến là sử dụng các shell "nâng cao" như Bash hoặc Zsh để tương tác chung và một shell "tước" như Ash hoặc Dash để thực thi các tập lệnh.
Khi chúng ta bắt đầu tập lệnh sau này, chúng ta sẽ xem cách chúng ta có thể xác định trình bao nào sẽ thực thi một tập lệnh nhất định.
Nếu bạn quan tâm đến sự so sánh chi tiết hơn giữa các shell này, đây là video giải thích thực sự tốt về nó:
Nếu phải giới thiệu một shell, tôi sẽ khuyên bạn nên bash vì nó là tiêu chuẩn và được sử dụng phổ biến nhất. Điều này có nghĩa là bạn sẽ có thể dịch kiến thức của mình sang hầu hết các môi trường.
Nhưng một lần nữa, sự thật là không có RẤT NHIỀU sự khác biệt giữa hầu hết các loại vỏ. Vì vậy, trong mọi trường hợp, bạn có thể thử một vài và xem bạn thích cái nào nhất.;)
Nhận xét về tùy chỉnh
Tôi vừa đề cập rằng Fish đi kèm với cấu hình tích hợp như tự động hoàn thành và tô sáng cú pháp. Tính năng này được tích hợp sẵn trong Fish, nhưng trong Bash hoặc Zsh, bạn cũng có thể định cấu hình các tính năng này.
Vấn đề là các shell có thể tùy chỉnh. Bạn có thể chỉnh sửa cách chương trình hoạt động, những lệnh nào bạn có sẵn, thông tin lời nhắc của bạn hiển thị và hơn thế nữa.
Chúng tôi sẽ không thấy các tùy chọn tùy chỉnh chi tiết ở đây, nhưng biết rằng khi bạn cài đặt shell trong máy tính của mình, một số tệp nhất định sẽ được tạo trên hệ thống của bạn. Sau này, bạn có thể chỉnh sửa các tệp đó để tùy chỉnh chương trình của mình.
Ngoài ra, có rất nhiều plugin trực tuyến cho phép bạn tùy chỉnh trình bao của mình theo cách dễ dàng hơn. Bạn chỉ cần cài đặt chúng và nhận các tính năng mà plugin cung cấp. Một số ví dụ là OhMyZsh và Starship.
Các tùy chọn tùy chỉnh này cũng đúng với Thiết bị đầu cuối.
Vì vậy, bạn không chỉ có nhiều tùy chọn shell và terminal để lựa chọn - bạn còn có nhiều tùy chọn cấu hình cho từng shell và terminal.
Nếu bạn đang bắt đầu, tất cả những thông tin này có thể khiến bạn cảm thấy hơi choáng ngợp. Nhưng chỉ cần biết rằng có rất nhiều tùy chọn có sẵn và mỗi tùy chọn cũng có thể được tùy chỉnh. Vậy là xong.
Các lệnh phổ biến và hữu ích nhất để sử dụng
Bây giờ chúng ta đã có nền tảng về cách hoạt động của CLI, hãy đi sâu vào các lệnh hữu ích nhất mà bạn có thể bắt đầu sử dụng cho các công việc hàng ngày của mình.
Hãy nhớ rằng những ví dụ này sẽ dựa trên cấu hình hiện tại của tôi (Bash trên hệ điều hành Linux). Nhưng dù sao thì hầu hết các lệnh cũng nên áp dụng cho hầu hết các cấu hình.
- Tiếng vọng in trong thiết bị đầu cuối bất kỳ tham số nào mà chúng tôi truyền vào.
echo Hello freeCodeCamp! // Output: Hello freeCodeCamp!
- pwd là viết tắt của thư mục làm việc in và nó in "địa điểm" hoặc thư mục mà chúng ta hiện đang ở trong máy tính.
pwd // Output: /home/German
- ls trình bày cho bạn nội dung của thư mục mà bạn hiện đang ở. Nó sẽ cung cấp cho bạn cả tệp và các thư mục khác mà thư mục hiện tại của bạn chứa.
Ví dụ, đây là thư mục dự án React mà tôi đã làm việc gần đây:
ls // Output:
node_modules package.json package-lock.json public README.md src
Nếu bạn chuyển lệnh này, cờ hoặc paremter -a
Nó cũng sẽ hiển thị cho bạn các tệp hoặc thư mục ẩn. Giống như .git
hoặc .gitignore
tệp
ls -a // Output:
. .env .gitignore package.json public src
.. .git node_modules package-lock.json README.md
- cd là viết tắt của Change directory và nó sẽ đưa bạn từ thư mục hiện tại sang thư mục khác.
Trong khi ở trên thư mục chính, tôi có thể nhập cd Desktop
và nó sẽ đưa tôi đến Thư mục Máy tính để bàn.
Nếu tôi muốn đi lên một thư mục, nghĩa là đi đến thư mục chứa thư mục hiện tại, tôi có thể nhập cd ..
Nếu bạn nhập cd
một mình, nó sẽ đưa bạn đến thẳng thư mục chính của bạn.
- mkdir là viết tắt của make directory và nó sẽ tạo một thư mục mới cho bạn. Bạn phải chuyển lệnh tham số tên thư mục.
Nếu tôi muốn tạo một thư mục mới có tên "Kiểm tra", tôi sẽ nhập mkdir test
.
-
rmdir là viết tắt của Xóa thư mục và nó chỉ làm điều đó. Nó cần tham số tên thư mục giống như
mkdir
:rmdir test
. -
chạm cho phép bạn tạo một tệp trống trong thư mục hiện tại của bạn. Vì các tham số, nó lấy tên tệp, chẳng hạn như
touch test.txt
. -
rm cho phép bạn xóa tệp theo cách tương tự
rmdir
cho phép bạn loại bỏ các thư mục.
rm test.txt
-
cp cho phép bạn sao chép tệp hoặc thư mục. Lệnh này nhận hai tham số:tham số đầu tiên là tệp hoặc thư mục bạn muốn sao chép và tham số thứ hai là điểm đến của bản sao của bạn (nơi bạn muốn sao chép tệp / thư mục của mình vào).
Nếu tôi muốn tạo một bản sao của tệp txt của mình trong cùng một thư mục, tôi có thể nhập như sau:
cp test.txt testCopy.txt
Thấy rằng thư mục không thay đổi, vì đối với "đích", tôi nhập tên mới của tệp.
Nếu tôi muốn sao chép tệp vào một thư mục khác nhau, nhưng vẫn giữ nguyên tên tệp, tôi có thể nhập như sau:
cp test.txt ./testFolder/
Và nếu tôi muốn sao chép sang một thư mục khác thay đổi tên trường, tất nhiên tôi có thể nhập vào:
cp test.txt ./testFolder/testCopy.txt
- mv là viết tắt của chuyển và cho phép chúng tôi di chuyển một tệp hoặc thư mục từ nơi này sang nơi khác. Đó là, tạo nó trong một thư mục mới và xóa nó trong thư mục trước đó (giống như bạn có thể làm bằng cách cắt và dán).
Một lần nữa, lệnh này cần đến hai paremers, tệp hoặc thư mục chúng ta muốn di chuyển và đích.
mv test.txt ./testFolder/
Chúng ta cũng có thể thay đổi tên của tệp trong cùng một lệnh nếu chúng ta muốn:
mv test.txt ./testFolder/testCopy.txt
- đầu cho phép bạn xem phần đầu của tệp hoặc dữ liệu được tổng hợp trực tiếp từ thiết bị đầu cuối.
head test.txt // Output:
this is the beginning of my test file
- đuôi hoạt động giống nhau nhưng nó sẽ hiển thị cho bạn phần cuối của tệp.
tail test.txt // Output:
this is the end of my test file
- --trợ giúp Cờ có thể được sử dụng trên hầu hết các lệnh và nó sẽ trả về thông tin về cách sử dụng lệnh đó.
cd --help // output:
cd: cd [-L|[-P [-e]] [-@]] [dir]
Change the shell working directory.
Thay đổi thư mục hiện tại thành DIR. DIR mặc định là giá trị của biến shell HOME.
Biến CDPATH xác định đường dẫn tìm kiếm cho thư mục chứa DIR. Các tên thư mục thay thế trong CDPATH được phân tách bằng dấu hai chấm :
.
Tên thư mục rỗng giống với thư mục hiện tại nếu DIR bắt đầu bằng ...
.
- Theo cách tương tự, người đàn ông lệnh sẽ trả về thông tin về bất kỳ lệnh cụ thể nào.
man cp // output:
CP(1) User Commands CP(1)
NAME
cp - copy files and directories
SYNOPSIS
cp [OPTION]... [-T] SOURCE DEST
cp [OPTION]... SOURCE... DIRECTORY
cp [OPTION]... -t DIRECTORY SOURCE...
DESCRIPTION
Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY.
Mandatory arguments to long options are mandatory for short options
too.
-a, --archive
same as -dR --preserve=all
--attributes-only
don't copy the file data, just the attributes
...
Bạn thậm chí có thể nhập man bash
và điều đó sẽ trả lại một cẩm nang khổng lồ về mọi thứ cần biết về shell này.;)
- mã sẽ mở trình soạn thảo mã mặc định của bạn. Nếu bạn nhập lệnh một mình, nó chỉ mở trình chỉnh sửa với tệp / thư mục mới nhất mà bạn đã mở.
Bạn cũng có thể mở một tệp nhất định bằng cách chuyển nó dưới dạng tham số:code test.txt
.
Hoặc mở tệp mới bằng cách chuyển tên tệp mới:code thisIsAJsFile.js
.
- chỉnh sửa sẽ mở các tệp văn bản trên trình soạn thảo văn bản dòng lệnh mặc định của bạn (nếu bạn đang sử dụng Mac hoặc Linux thì có thể là Nano hoặc Vim).
Nếu bạn mở tệp của mình và sau đó không thể thoát khỏi trình chỉnh sửa của mình, trước tiên hãy xem meme này:
![vimExit](https://www.freecodecamp.org/news/content/images/2022/03/vimExit.png)
Và sau đó nhập :q!
và nhấn enter.
Meme này rất buồn cười vì mọi người đều phải vật lộn với trình chỉnh sửa văn bản CLI lúc đầu, vì hầu hết các hành động (như thoát trình chỉnh sửa) đều được thực hiện bằng phím tắt. Sử dụng các trình chỉnh sửa này là một chủ đề hoàn toàn khác, vì vậy hãy tìm kiếm các hướng dẫn nếu bạn muốn tìm hiểu thêm.;)
-
ctrl + c cho phép bạn thoát khỏi tiến trình hiện tại mà thiết bị đầu cuối đang chạy. Ví dụ:nếu bạn đang tạo ứng dụng phản ứng với
npx create-react-app
và muốn hủy bản dựng tại một thời điểm nào đó, chỉ cần nhấn ctrl + c và nó sẽ dừng lại. -
Sao chép văn bản từ thiết bị đầu cuối có thể được thực hiện bằng ctrl + shift + c và dán có thể được thực hiện bằng ctrl + shift + v
-
rõ ràng sẽ xóa thiết bị đầu cuối của bạn khỏi tất cả nội dung trước đó.
-
thoát sẽ đóng thiết bị đầu cuối của bạn và (đây không phải là lệnh nhưng cũng rất tuyệt) ctrl + alt + t sẽ mở một thiết bị đầu cuối mới cho bạn.
-
Bằng cách nhấn phím lên và xuống bạn có thể điều hướng qua các lệnh trước đó bạn đã nhập.
-
Bằng cách nhấn vào tab bạn sẽ nhận được tự động hoàn thành dựa trên văn bản bạn đã viết cho đến nay. Bằng cách nhấn vào tab hai lần bạn sẽ nhận được các đề xuất dựa trên văn bản bạn đã viết cho đến nay.
Ví dụ:nếu tôi viết edit test
và tab hai lần , Tôi nhận được testFolder/ test.txt
. Nếu tôi viết edit test.
và nhấn tab văn bản của tôi tự động hoàn thành để edit test.txt
Lệnh Git
Bên cạnh việc làm việc xung quanh hệ thống tệp và cài đặt / gỡ cài đặt mọi thứ, tương tác với Git và các kho lưu trữ trực tuyến có lẽ là điều phổ biến nhất mà bạn sẽ sử dụng thiết bị đầu cuối với tư cách là nhà phát triển.
Thực hiện điều đó từ terminal hiệu quả hơn rất nhiều so với việc nhấp chuột xung quanh, vì vậy hãy cùng xem các lệnh git hữu ích nhất hiện có.
- git init sẽ tạo một kho lưu trữ cục bộ mới cho bạn.
git init // output:
Initialized empty Git repository in /home/German/Desktop/testFolder/.git/
-
git add thêm một hoặc nhiều tệp vào dàn. Bạn có thể nêu chi tiết một tệp cụ thể để thêm vào dàn hoặc thêm tất cả các tệp đã thay đổi bằng cách nhập
git add .
-
git cam kết cam kết các thay đổi của bạn đối với kho lưu trữ. Các cam kết phải luôn đi kèm với
-m
gắn cờ và thông báo cam kết.
git commit -m 'This is a test commit' // output:
[master (root-commit) 6101dfe] This is a test commit
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 test.js
- trạng thái git cho bạn biết bạn hiện đang ở chi nhánh nào và bạn có thay đổi cam kết hay không.
git status // output:
On branch master
nothing to commit, working tree clean
- bản sao git cho phép bạn sao chép (sao chép) kho lưu trữ vào thư mục bạn hiện đang ở. Hãy nhớ rằng bạn có thể sao chép cả kho lưu trữ từ xa (trong GitHub, GitLab, v.v.) và kho lưu trữ cục bộ (những kho lưu trữ trong máy tính của bạn).
git clone https://github.com/coccagerman/MazeGenerator.git // output:
Cloning into 'MazeGenerator'...
remote: Enumerating objects: 15, done.
remote: Counting objects: 100% (15/15), done.
remote: Compressing objects: 100% (15/15), done.
remote: Total 15 (delta 1), reused 11 (delta 0), pack-reused 0
Unpacking objects: 100% (15/15), done.
- git từ xa thêm nguồn gốc được sử dụng để nêu chi tiết URL của kho lưu trữ từ xa mà bạn sẽ sử dụng cho dự án của mình. Trong trường hợp bạn muốn thay đổi nó tại một số điểm, bạn có thể thực hiện bằng cách sử dụng lệnh
git remote set-url origin
.
git remote add origin https://github.com/coccagerman/testRepo.git
Hãy nhớ rằng bạn cần tạo repo từ xa của mình trước để lấy URL của nó. Chúng tôi sẽ xem cách bạn có thể thực hiện điều này từ dòng lệnh với một đoạn script sau.;)
- git từ xa -v cho phép bạn liệt kê kho lưu trữ từ xa hiện tại mà bạn đang sử dụng.
git remote -v // output:
origin https://github.com/coccagerman/testRepo.git (fetch)
origin https://github.com/coccagerman/testRepo.git (push)
- git push tải các thay đổi đã cam kết lên repo từ xa của bạn.
git push // output:
Counting objects: 2, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 266 bytes | 266.00 KiB/s, done.
Total 2 (delta 0), reused 0 (delta 0)
- chi nhánh git liệt kê tất cả các nhánh có sẵn trên repo của bạn và cho bạn biết bạn hiện đang ở nhánh nào. Nếu bạn muốn tạo một chi nhánh mới, bạn chỉ cần thêm tên chi nhánh mới dưới dạng tham số như
git branch <branch name>
.
git branch // output:
* main
- thanh toán git chuyển bạn từ chi nhánh này sang chi nhánh khác. Nó lấy nhánh đích của bạn làm paremeter.
git checkout newBranch // output:
Switched to branch 'newBranch'
- git pull kéo (tải xuống) mã từ kho lưu trữ từ xa của bạn và kết hợp nó với kho lưu trữ cục bộ của bạn. Điều này đặc biệt hữu ích khi làm việc theo nhóm, khi nhiều nhà phát triển đang làm việc trên cùng một cơ sở mã. Trong trường hợp này, mỗi nhà phát triển định kỳ lấy từ kho từ xa để làm việc trong một cơ sở mã bao gồm các thay đổi được thực hiện bởi tất cả các nhà phát triển khác.
Nếu có mã mới trong repo từ xa của bạn, lệnh sẽ trả về các tệp thực tế đã được sửa đổi trong phần kéo. Nếu không, chúng tôi nhận được Already up to date
.
git pull // output:
Already up to date.
- git diff cho phép bạn xem sự khác biệt giữa chi nhánh bạn hiện đang tham gia và chi nhánh khác.
git diff newBranch // output:
diff --git a/newFileInNewBranch.js b/newFileInNewBranch.js
deleted file mode 100644
index e69de29..0000000
Như một nhận xét bên lề, khi so sánh sự khác biệt giữa các nhánh hoặc đại diện, thông thường các công cụ trực quan như Meld được sử dụng. Không phải là bạn không thể hình dung nó trực tiếp trong terminal, nhưng các công cụ này được tạo ra để hình dung rõ ràng hơn.
- hợp nhất git hợp nhất (kết hợp) chi nhánh bạn hiện đang ở với một chi nhánh khác. Xin lưu ý rằng các thay đổi sẽ chỉ được kết hợp với chi nhánh bạn hiện đang tham gia, không áp dụng cho chi nhánh khác.
git merge newBranch // output:
Updating f15cf51..3a3d62f
Fast-forward
newFileInNewBranch.js | 0
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 newFileInNewBranch.js
- git log liệt kê tất cả các cam kết trước đây bạn đã thực hiện trong repo.
git log // output:
commit 3a3d62fe7cea7c09403c048e971a5172459d0948 (HEAD -> main, tag: TestTag, origin/main, newBranch)
Author: German Cocca <[email protected]>
Date: Fri Apr 1 18:48:20 2022 -0300
Added new file
commit f15cf515dd3ec398210108dce092debf26ff9e12
Author: German Cocca <[email protected]>
...
- --trợ giúp cờ sẽ hiển thị cho bạn thông tin về một lệnh nhất định, giống hệt như cách nó hoạt động với bash.
git diff --help // output:
GIT-DIFF(1) Git Manual GIT-DIFF(1)
NAME
git-diff - Show changes between commits, commit and working tree, etc
SYNOPSIS
git diff [options] [<commit>] [--] [<path>...]
git diff [options] --cached [<commit>] [--] [<path>...]
...
Tập lệnh đầu tiên của chúng tôi
Bây giờ chúng ta đã sẵn sàng để bắt đầu phần thực sự thú vị và tuyệt vời của dòng lệnh, tập lệnh!
Như tôi đã đề cập trước đây, một tập lệnh chỉ là một chuỗi các lệnh hoặc hướng dẫn mà chúng ta có thể thực hiện tại bất kỳ thời điểm nào. Để giải thích cách chúng ta có thể viết mã một mã, chúng ta sẽ sử dụng một ví dụ đơn giản cho phép chúng ta tạo repo github bằng cách chạy một lệnh duy nhất.;)
-
Điều đầu tiên cần làm là tạo một
.sh
tập tin. Bạn có thể đặt nó bất cứ nơi nào muốn. Tôi đã gọi cho tôinewGhRepo.sh
. -
Sau đó, mở nó trên trình soạn thảo văn bản / mã mà bạn chọn.
-
Trên dòng đầu tiên của chúng tôi, chúng tôi sẽ viết như sau:
#! /bin/sh
Đây được gọi là shebang và chức năng của nó là khai báo trình bao nào sẽ chạy tập lệnh này.
Hãy nhớ trước đây khi chúng tôi đề cập rằng chúng ta có thể sử dụng một trình bao nhất định cho tương tác chung và một trình bao nhất định khác để thực thi một tập lệnh? Chà, shebang là hướng dẫn ra lệnh cho shell nào chạy script.
Như đã đề cập, chúng tôi đang sử dụng shell "rút gọn" (còn được gọi là sh shell) để chạy các tập lệnh vì chúng hiệu quả hơn (mặc dù thành thật mà nói thì sự khác biệt có thể không đáng chú ý, đó chỉ là sở thích cá nhân). Trong máy tính của tôi, tôi có dấu gạch ngang làm vỏ sh của tôi.
Nếu chúng ta muốn script này chạy với bash thì shebang sẽ là #! /bin/bash
- Dòng tiếp theo của chúng ta sẽ là
repoName=$1
Ở đây chúng tôi đang khai báo một biến được gọi là repoName và gán nó cho giá trị của tham số đầu tiên mà tập lệnh nhận được.
A tham số là một tập hợp các ký tự được nhập sau script / comand. Giống như với cd
, chúng ta cần chỉ định một tham số thư mục để thay đổi thư mục (ví dụ:cd testFolder
).
Một cách chúng ta có thể xác định các tham số trong tập lệnh là sử dụng ký hiệu đô la và thứ tự mà tham số đó được mong đợi.
Nếu tôi mong đợi nhiều hơn một tham số, tôi có thể viết:
paramOne=$1
paramTwo=$2
paramThree=$3
...
- Vì vậy, chúng tôi đang mong đợi tên kho lưu trữ làm tham số của tập lệnh của chúng tôi. Nhưng điều gì sẽ xảy ra nếu người dùng quên nhập nó? Chúng tôi cần lập kế hoạch cho điều đó để tiếp theo, chúng tôi sẽ viết mã có điều kiện liên tục yêu cầu người dùng nhập tên repo cho đến khi nhận được thông số đó.
Chúng tôi có thể làm điều đó như thế này:
while [ -z "$repoName" ]
do
echo 'Provide a repository name'
read -r -p $'Repository name:' repoName
done
Những gì chúng tôi đang làm ở đây là:
- Trong khi biến repoName không được chỉ định (
while [ -z "$repoName" ]
) - Ghi vào bảng điều khiển thông báo này (
echo 'Provide a repository name'
) - Sau đó, đọc bất kỳ đầu vào nào mà người dùng cung cấp và gán đầu vào cho biến repoName (
read -r -p $'Repository name:' repoName
)
- Bây giờ chúng tôi đã có tên repo của mình, chúng tôi có thể tạo repo Git cục bộ của mình như sau:
echo "# $repoName" >> README.md
git init
git add .
git commit -m "First commit"
Đây là tạo một tệp readme và ghi một dòng với tên repo (echo "# $repoName" >> README.md
) và sau đó khởi tạo git repo và thực hiện một cam kết đầu tiên.
- Sau đó, đã đến lúc tải repo của chúng tôi lên github. Để làm điều đó, chúng tôi sẽ tận dụng API github trong lệnh sau:
curl -u coccagerman https://api.github.com/user/repos -d '{"name": "'"$repoName"'", "private":false}'
cuộn tròn là lệnh truyền dữ liệu từ hoặc đến máy chủ, sử dụng một trong nhiều giao thức được hỗ trợ.
Tiếp theo, chúng tôi sử dụng -u
cờ để khai báo người dùng mà chúng tôi đang tạo đại diện cho (-u coccagerman
).
Tiếp theo là điểm cuối được cung cấp bởi API GitHub (https://api.github.com/user/repos
)
Và cuối cùng, chúng tôi đang sử dụng -d
cờ để chuyển các tham số cho lệnh này. Trong trường hợp này, chúng tôi chỉ ra tên kho lưu trữ (mà chúng tôi đang sử dụng repoName
của chúng tôi biến) và cài đặt private
tùy chọn thành false
, vì chúng tôi muốn repo của mình là puiblic.
Rất nhiều tùy chọn cấu hình khác có sẵn trong API, vì vậy hãy kiểm tra tài liệu để biết thêm thông tin.
- Sau khi chạy lệnh này, GitHub sẽ nhắc chúng tôi nhập mã thông báo riêng tư của chúng tôi để xác thực.
Nếu bạn chưa có mã thông báo riêng tư, bạn có thể tạo mã này trong GitHub trong Cài đặt> Cài đặt nhà phát triển> Mã thông báo truy cập cá nhân
- Tuyệt vời, chúng tôi sắp hoàn tất! Những gì chúng tôi cần bây giờ là URL từ xa trong repo GitHub mới được tạo của chúng tôi.
Để đạt được điều đó, chúng tôi sẽ sử dụng lại curl và API GitHub, như sau:
GIT_URL=$(curl -H "Accept: application/vnd.github.v3+json" https://api.github.com/repos/coccagerman/"$repoName" | jq -r '.clone_url')
Here we're declaring a variable called GIT_URL
and assigning it to whatever the following command returns.
The -H
flag sets the header of our request.
Then we pass the GitHub API endpoint, which should contain our user name and repo name (https://api.github.com/repos/coccagerman/"$repoName"
).
Then we're piping the return value of our request. Piping just means passing the return value of a process as the input value of another process. We can do it with the |
symbol like <process1> | <process2>
.
And finally we run the jq
command, which is a tool for processing JSON inputs. Here we tell it to get the value of .clone_url
which is where our remote git URL will be according to the data format provided by the GitHub API.
- And as last step, we rename our master branch to main, add the remote origin we just obtained, and push our code to GitHub! =D
git branch -M main
git remote add origin $GIT_URL
git push -u origin main
Our full script should look something like this:
#! /bin/sh
repoName=$1
while [ -z "$repoName" ]
do
echo 'Provide a repository name'
read -r -p $'Repository name:' repoName
done
echo "# $repoName" >> README.md
git init
git add .
git commit -m "First commit"
curl -u <yourUserName> https://api.github.com/user/repos -d '{"name": "'"$repoName"'", "private":false}'
GIT_URL=$(curl -H "Accept: application/vnd.github.v3+json" https://api.github.com/repos/<yourUserName>/"$repoName" | jq -r '.clone_url')
git branch -M main
git remote add origin $GIT_URL
git push -u origin main
- Now it's time to test our script! To execute it there're two things we can do.
One option is to enter the shell name and pass the file as parameter, like:dash ../ger/code/projects/scripts/newGhRepo.sh
.
And the other is to make the file executable by running chmod u+x ../ger/code/projects/scripts/newGhRepo.sh
.
Then you can just execute the file directly by running ../ger/code/projects/scripts/newGhRepo.sh
.
Và đó là nó! We have our script up and running. Everytime we need a new repo we can just execute this script from whatever directory we're in.
But there's something a bit annoying about this. We need to remember the exact route of the script directory. Wouldn't it be cool to execute the script with a single command that it's always the same independently of what directory we're at?
In come bash aliases to solve our problem.
Aliases are a way bash provides for making names for exact commands we want to run.
To create a new alias, we need to edit the bash configuration files in our system. This files are normally located in the home directory. Aliases can be defined in different files (mainly .bashrc
or .bash_aliases
).
I have a .bash_aliases
file on my system, so let's edit that.
-
In our CLI we enter
cd
to go over home directory. -
Then we can enter
ls -a
to list all files (includen hidden ones) and check if we have either a.bashrc
or.bash_aliases
file in our system. -
We open the file with our text/code editor of choice.
-
And we write our new alias like this:
alias newghrepo="dash /home/German/Desktop/ger/code/projects/scripts/newGhRepo.sh"
Here I'm declaring the alias name, the actual command I'm going to enter to run the script (newghrepo
).
And between quotes, define what that alias is going to do ("dash /home/German/Desktop/ger/code/projects/scripts/newGhRepo.sh"
)
See that I'm passing the absolute path of the script, so that this command works the same no matter what my current directory is.
If you don't know what the absolute path of your script is, go to the script directory on your terminal and enter readlink -f newGhRepo.sh
. That should return the full path for you.;)
- After we're done editing, we save our file, restart our terminal, and voilà! Now we can run our script by just entering
newghrepo
, no matter in what directory we currently are. Much quicker than opening the browser and clicking around to create our repo! =D
I hope this gives you a little taste of the kind of optimizations that are possible with scripting. It certainly requires a bit more work the first time you write, test, and set up the script. But after that, you'll never have to perform that task manually again.;)
Round up
The terminal can feel like an intimidating and intricate place when you're starting out. But it's certainly worth it to put time and effort into learning the ins and outs of it. The efficiency benefits are too good to pass up!
If you're interested in learning more about the terminal and Bash, Zach Gollwitzer has an awesome crash course series on youtube.
He has also great tutorials on other topics such as Node and Javascript, so I recommend that you follow him.;)
As always, I hope you enjoyed the article and learned something new. If you want, you can also follow me on linkedin or twitter.
Cheers and see you in the next one! =D