Tôi đang tìm kiếm một cách đơn giản và đáng tin cậy để lấy tên của trình bao hiện tại từ bên trong tập lệnh hoặc tệp có nguồn gốc ( không phải từ dòng lệnh). Tôi đã dự kiến sẽ làm $(basename "$SHELL")
nhưng nếu vỏ đăng nhập của tôi là zsh
và tôi có mã sau đây trong some_script.sh
this_shell=$( basename "$SHELL" )
echo "The Shell is $this_shell"
echo "The Shell is $0"
và tôi chạy nó với bash some_script.sh
, nó vẫn liệt kê zsh
thay vì bash
mặc dù trình thông dịch được sử dụng /bin/bash
. Tôi không chắc tại sao các nhà thiết kế shell lại chọn hiển thị shell mặc định thay vì shell hiện tại, nhưng đó dường như là những gì chúng tôi đang mắc kẹt.
Có một số câu hỏi hơi giống nhau khác ( ở đây và ở đây ), nhưng câu trả lời của họ bị thiếu theo nhiều cách.
- Họ thường cho rằng người dùng đang cố gắng tìm ra loại vỏ tương tác nào họ đang sử dụng, nhưng điều đó thật điên rồ. Tôi biết shell nào tôi đang gõ lệnh vào - Tôi cần mã có thể chạy ở bất cứ đâu để có thể xác định nó đang sử dụng shell nào .
- Họ thường đưa ra một số điều khác nhau để thử - một lần nữa như thể bạn đang ở trên dòng lệnh và chỉ có thể mân mê cho đến khi bạn biết bạn đang sử dụng bash - nhưng tôi cần một điều đáng tin cậy trong mọi ngữ cảnh.
- Họ thường đưa ra những thứ hoàn toàn vô dụng từ các kịch bản, như thế
echo $0
. Điều đó thất bại như thể hiện trong kịch bản trên. (Có, nó hoạt động trong một dòng lệnh shell tương tác, nhưng tại sao bạn sẽ không biết bạn đang sử dụng shell nào?) - Đôi khi, họ đưa ra các lệnh (trong các thử nghiệm giới hạn của tôi) bao gồm thông tin chính xác, như
ps -p $$
, nhưng thiếu các lệnh sed / awk tương thích đa nền tảng để chuyển nó qua chỉ để lấy tên shell và bỏ qua các thông tin khác đi kèm Cho đi xe. - Chúng bao gồm những thứ sẽ chỉ hoạt động trên một vài vỏ, như
$BASH_VERSION
và$ZSH_VERSION
. Tôi muốn hỗ trợ như nhiều vỏ càng tốt, chẳng hạn nhưfish
,csh
,tcsh
.
Làm thế nào để tôi phát hiện chính xác và đáng tin cậy bất kỳ vỏ hiện tại ? Tôi đang tìm kiếm thứ gì đó sẽ hoạt động trên các nền tảng, trong các tập lệnh và cho càng nhiều shell càng tốt và hợp lý 1 .
CẬP NHẬT : Khi tôi đăng câu hỏi này, tôi đã dự đoán rằng có một số cơ sở được tích hợp sẵn để cung cấp cho chúng tôi thông tin này, dường như không phải là trường hợp. Vì dường như không thể tránh khỏi việc dựa vào thứ gì đó bên ngoài vỏ, tôi nên nói rõ hơn rằng tôi đang yêu cầu mộtgiải pháp đa nền tảng (mặc dù ngụ ý phản đối của tôi đối với các câu trả lời khác ở trên, có thể dễ bị bỏ lỡ nếu bạn không 'Đọc kỹ câu hỏi).
Cập nhật 2 Nếu bất cứ ai vẫn tin rằng đây là bản sao của câu hỏi chỉ dành cho Linux vì câu trả lời của Stéphane không chỉ dành cho Linux, đây là những khác biệt giữa những gì tôi yêu cầu và những gì anh ấy đã cung cấp. (Lưu ý rằng những gì anh ấy đã viết là khéo léo và tôi không gõ nó, nhưng nó không giải quyết được vấn đề của tôi.)
- Tôi đang tìm kiếm một cái gì đó đơn giản và đáng tin cậy , đó là
- có thể được thêm vào bất kỳ định nghĩa kịch bản hay chức năng (mà có thể được bắt nguồn bởi một
.zshrc
hoặc.bash_profile
hoặc bất cứ điều gì) sang cành khác. - Bạn không thể sử dụng tập lệnh của anh ấy như một tiện ích bên ngoài chuyển tên trình thông dịch sang tập lệnh / hàm gọi, vì nó sẽ luôn được trình thông dịch mặc định giải thích và trả về đó. Điều này làm cho nó khó khăn hoặc không thể sử dụng cho mục đích của tôi. Nếu có thể, nó vẫn còn rất rất khó, và giải pháp để làm cho nó hoạt động không được đưa ra trong câu trả lời. Do đó, ông không trả lời câu hỏi của tôi, do đó nó không phải là một bản sao.
Nếu bạn muốn thấy một cái gì đó sẽ hoạt động, hãy xem ShellDetective trên GitHub . Điều đó có thể giúp dễ dàng nhận thấy sự khác biệt giữa những gì đã có trên SE và câu hỏi này đang tìm kiếm điều gì (và thực tế được viết để đáp ứng nhu cầu của câu hỏi này, không được đáp ứng ở bất kỳ nơi nào khác).
(PS nếu bạn không thể tin rằng có một trường hợp sử dụng cho việc này, hãy tưởng tượng các chức năng mà có được nguồn vào .zshrc
, .bash_profile
hoặc .profile
tùy thuộc vào những gì máy chủ đang được sử dụng và những gì nó có vỏ sẵn. Họ đang có nguồn gốc do đó họ không có dòng công việc. Họ là hữu ích nhất nếu chúng có thể hoạt động trong bất kỳ vỏ nào, nhưng đôi khi chúng phải biết chúng nằm trong vỏ nào để biết cách cư xử.)
1 Tôi không quan tâm đến "vỏ" không phải là vỏ theo bất kỳ ý nghĩa truyền thống nào của từ này. Tôi không quan tâm đến một số vỏ mà một số người viết cho chính mình. Tôi chỉ quan tâm đến các shell thực sự xảy ra trong tự nhiên và ai đó có thể hiểu được phải sử dụng khi đăng nhập vào một số máy chủ mà họ không thể cài đặt bất kỳ shell nào họ muốn.
sh -c "…"
, và sau đó thực hiện phần lớn công việc theo cú pháp shell POSIX.
fish
và sử dụng nó để chạy tập lệnh của bạn, bạn có muốn fish
hay csh
không?