Làm cách nào để thêm hàm vào .bash_profile / .profile / bashrc trong shell?


24

Tôi có một chức năng chuyển đổi thời gian kỷ nguyên thành ngày. Đây là định nghĩa

date1(){
  date -d @$1
}

Tôi muốn có thể viết:

$ date1 xxxyyy

Trong đó xxxyyy là tham số tôi truyền vào hàm của mình để tôi có thể nhận được ngày tương ứng. Tôi hiểu rằng tôi phải thêm nó vào một trong hai .bash_profile, .profilehoặc .bashrcvà sau đó nguồn nó:

$ source file

Nhưng, tôi không chắc nên đặt tập tin nào vào. Hiện tại, tôi có nó .profile. Nhưng để chạy nó, tôi phải làm source .profilemọi lúc.

Lý tưởng nhất là làm cho nó có sẵn, khi máy tính khởi động giống như biến môi trường.


cho một mẫu đầu vào; 1.text đầu ra epochconverter.com bây giờ là 1514917788; 2. từ bash chính nó $ date +% s trên stackoverflow.com/questions/1092631/iêu
AnneTheAgile

Câu trả lời:


25

Từ man bash:

Khi bash được gọi dưới dạng shell đăng nhập tương tác hoặc dưới dạng shell không tương tác với tùy chọn --login, trước tiên, nó sẽ đọc và thực thi các lệnh từ tệp / etc / profile, nếu tệp đó tồn tại. Sau khi đọc tệp đó, nó tìm ~ / .bash_profile, ~ / .bash_login và ~ / .profile, theo thứ tự đó, đọc và thực thi các lệnh từ lệnh đầu tiên tồn tại và có thể đọc được.

Nói cách khác, bạn có thể đặt nó trong bất kỳ một trong ~/.bash_profile, ~/.bash_loginhoặc ~/.profile, hoặc bất kỳ tập tin sourced bởi một trong những người . Thông thường ~/.profilesẽ nguồn ~/.bashrc, đó là "tệp khởi tạo cá nhân, được thực thi cho shell đăng nhập."

Để kích hoạt nó, hãy khởi động một shell mới, chạy exec $SHELLhoặc chạy source ~/.bashrc.


1
Vâng, tôi đã thử cách của bạn để tạo một chức năng tùy chỉnh in đối số, nhưng ngay cả khi tôi thêm chức năng .bash_profileđó vào thì tôi cũng phải làm source ~/.bash_profilemỗi khi tôi mở terminal bằng phím tắt Ctrl+Alt+T.
Vicky Dev

@VickyDev Nếu bạn phải luôn source ~/.bash_profileluôn như vậy thì đó là dấu hiệu cho thấy thiết lập Bash của bạn không theo tiêu chuẩn hoặc bị hỏng (theo man bashđầu ra được đề cập). Bạn có chắc là bạn đang thực sự chạy Bash? Ví dụ, có echo $BASHPIDin gì không?
l0b0

Bạn có cần thêm #!/bin/shvào đầu .profileđể xác định hàm không?
Hẻm núi Kolob

13

Sau khi bạn xác định chức năng trong của bạn .profile, thêm export -f date1. Điều này sẽ xuất các chức năng để sử dụng bởi vỏ đăng nhập của bạn.


+1 để xuất, tôi đã phải gọi và bí danh trong ssh ProxyCommand và nó tiếp tục viết về bí danh không tìm thấy ngay cả sau khi nguồn .profile. Hoạt động như một lá bùa sau khi xuất khẩu.
Abhishek Anand

7

Các tùy chỉnh cho vỏ tương tác đi vào ~/.bashrc. Những thứ bạn muốn chạy khi đăng nhập ~/.profile(hoặc ~/.bash_profile, nhưng nó thường không được tải khi đăng nhập bằng đồ họa).

Đặt định nghĩa hàm này trong ~/.bashrc.

Vì bash không tải .bashrckhi nó là một vỏ đăng nhập, buộc nó phải làm như vậy: viết một ~/.bash_profilechứa

. ~/.profile
case $- in *i*) . ~/.bashrc;; esac

tức là tải ~/.profile, và cũng tải ~/.bashrcnếu vỏ tương tác.

Xem Thay thế cho .bashrc và các bài đăng được liên kết ở đó.


1

csh và tcsh không hỗ trợ các chức năng như bash nhưng bạn có thể làm điều đó.

Ví dụ: đây là một chức năng đơn giản để in một số văn bản

alias print_hello_world 'eval echo "hello world"'

chuyển đối số cho kịch bản

repeate_after_me 'eval echo "$1"'

thực hiện mã nhiều dòng như một câu lệnh if hơi phức tạp nhưng ở đây bạn đi.

alias X 'eval "if (\!:1 =~ 'yes') then \\
          echo yes \\
          else \\
          echo no \\
          endif"'

bạn sẽ vẫn phải tránh nhưng phần phức tạp nhất là thực hiện \!:[x]cú pháp để lấy đầu vào từ dòng lệnh.

Điều đó là đủ để giúp bạn sắp xếp ra.


0

Bạn có thể chuyển hướng tất cả các chức năng hiện tại sang bashrc với bộ sắp chữ .

Ví dụ: đây là cách tôi thêm chức năng của lệnh openstack với tham số tùy chọn, vào bashrc:

urc() { . stackrc; set -x; openstack server list --all $1; set +x; }
typeset -f >> ~/.bashrc

Bây giờ nó được lưu cho các phiên trong tương lai và có thể được sử dụng như:

$ urc 

hoặc là

$ urc --debug

-1

điểm 18: Trong trí nhớ cũ của tôi khi một quản trị viên, học ksh và bash là cách khác. 1: - / etc / nội dung hồ sơ là sysWide. / etc / skel chứa tệp được cung cấp cho các tài khoản mới. Vì Bash bây giờ là phổ biến của tất cả các distro. tiếp theo sẽ là 2: - ~ / .profile làm tiêu chuẩn hệ thống, sau đó trong nội dung của .profile "nếu tồn tại" .bash_profile sẽ đặt -> 3: - .bash_profile 4: - .bash_login 5: -. bashrc. Tôi nghĩ rằng thứ tự chính xác hơn, thiết lập môi trường Terminal và Shell tiêu chuẩn và .bash_login thông thường không bao giờ được tìm thấy hoặc tồn tại (tùy chỉnh cho mỗi người dùng). Với .profile $ PATH là chính nếu.
Hiện tại tôi đang tìm thấy thêm .bash_profile .profile vẫn đang chiếm ưu thế và không tôn trọng sự hiện diện của .bash_profile. Cùng với thông tin tiêu đề, không ai cập nhật, ví dụ: bash startup Samples - cấu trúc thư mục đó không còn nữa - cùng với các ví dụ và tệp được gzip'd. Vì vậy, cập nhật lên Gnu-Bash theo thứ tự


1
bạn đang làm gì đó?
Jesse_b
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.