Điểm:0

Bash: Xác định một chức năng trong bashrc có thể được sử dụng bởi bất kỳ tập lệnh nào trên toàn cầu

lá cờ kp

Tôi muốn xác định một chức năng trong ~/.bashrc và sử dụng nó trong các tập lệnh khác nhau thông qua xuất -f hoặc nguồn .bashrc.

Chức năng:

nano ~/.bashrc

hàm test_func() {
    yt-dlp -f '299+140' --merge-output-format mp4 -cia List.txt;
}

xuất -f test_func

Kịch bản:

#!/bin/bash

cd /home/admn/Downloads/YT_DL;

test_func --autonumber-start 101 -o '%(autonumber)1d_%(title)s.%(ext)s';

Vấn đề-1:

Sau đó test_func, phần còn lại của lệnh --autonumber-start 101 -o '%(autonumber)1d_%(title)s.%(ext)s' không hoạt động chút nào.



Vấn đề-2:

Trước đó khi tôi cố gắng sử dụng nguồn .bashrc trong kịch bản của tôi, tôi đã nhận được những lỗi này:

/usr/local/scripts/test.sh: dòng 3: .bashrc: Không có tệp hoặc thư mục như vậy
/usr/local/scripts/test.sh: dòng 12: test_func: không tìm thấy lệnh

Chức năng (không có xuất -f):

nano ~/.bashrc

hàm test_func() {
    yt-dlp -f '299+140' --merge-output-format mp4 -cia List.txt;
}

Kịch bản (với nguồn .bashrc):

#!/bin/bash

nguồn .bashrc

cd /home/admn/Downloads/YT_DL;

test_func --autonumber-start 101 -o '%(autonumber)1d_%(title)s.%(ext)s';

Chỉnh sửa-1:

$ bash -xv /usr/local/scripts/test.sh
#!/bin/bash

nguồn /home/admn/.bashrc
+ nguồn /home/admn/.bashrc
# ~/.bashrc: được thực thi bởi bash(1) đối với shell không đăng nhập.
# xem /usr/share/doc/bash/examples/startup-files (trong gói bash-doc)
# ví dụ như

# bí danh pip='pip3.7'
bí danh python='python3'
++ bí danh python=python3

# Nếu không chạy tương tác thì đừng làm gì
trường hợp $- trong
    *tôi*) ;;
      *) trở lại;;
thoát hiểm
++ trường hợp $- trong
++ trở lại

test_func --autonumber-start 101 -o '%(autonumber)1d_%(title)s.%(ext)s';
+ test_func --autonumber-start 101 -o '%(autonumber)1d_%(title)s.%(ext)s'
/usr/local/scripts/test.sh: dòng 5: test_func: không tìm thấy lệnh
$ 

Đây là một số chủ đề tôi đã trải qua; và mặc dù tôi đã có một số ý tưởng, nhưng tôi vẫn không thể tìm ra giải pháp cho trường hợp sử dụng của mình. Cảm ơn.

https://unix.stackexchange.com/questions/63665/how-to-define-a-bash-feft-that-can-be-used-by-different-scripts

https://stackoverflow.com/questions/6218268/how-to-define-a-bash-feft-for-use-in-any-script

https://stackoverflow.com/questions/17219174/variables-set-in-bashrc-and-accessing-them-in-shellscript

https://stackoverflow.com/questions/1500499/how-do-you-call-a-function-defined-in-bashrc-from-the-shell

Xác định hàm bash có sẵn trên toàn cầu sẽ được sử dụng bởi bất kỳ tập lệnh nào

Hệ điều hành: Ubuntu MATE 21.04

Bash: 5.1.4(1)-phát hành (x86_64-pc-linux-gnu)

Điểm:3
lá cờ tm

Nếu bạn muốn hàm sử dụng tham số, bạn cần đề cập rõ ràng đến chúng.

hàm test_func() {
    yt-dlp "$@" -f '299+140' --merge-output-format mp4 -cia List.txt
    #~~~~
}

"$@" là viết tắt của "tất cả các tham số", bạn cũng có thể sử dụng các tham số vị trí như "$1", "$2", vân vân.

Nếu bạn lấy nguồn tệp từ một thư mục khác, bạn cần chỉ định đường dẫn đầy đủ đến tệp đó hoặc có đường dẫn của tệp trong $PATH.

nguồn ~/.bashrc
# hoặc
ĐƯỜNG+=:~
nguồn .bashrc

Sau khi cập nhật: Của bạn .bashrc chứa một trở lại ngừng xử lý .bashrc nếu không chạy trong trình bao tương tác. Đặt phần khai báo hàm ở đâu đó trước điều kiện nếu bạn cũng muốn thực thi nó trong các trình bao không tương tác.

lá cờ tm
Hãy thử chạy tập lệnh của bạn trong `set -xv` để bạn biết lệnh nào đang được chạy.
lá cờ tm
`return` thoát khỏi `.bashrc` trước khi đến phần khai báo hàm.
lá cờ tm
`.bashrc` của bạn chứa `return` sẽ ngừng xử lý `.bashrc` nếu không chạy trong trình bao tương tác. Đặt phần khai báo hàm ở đâu đó trước điều kiện nếu bạn cũng muốn thực thi nó trong các trình bao không tương tác.
Jags avatar
lá cờ kp
chức năng đăng trước khi điều kiện `return` đã giải quyết nó. Vì vậy, phần này có `# Nếu không chạy tương tác, đừng làm gì cả | trường hợp $- trong | *tôi*) ;; | *) trở lại;; | esac` cần đi đến cuối tệp `.bashrc`? Cảm ơn bạn rất nhiều.
Jags avatar
lá cờ kp
Cuối cùng, có cách nào "ưa thích/tiêu chuẩn/tốt hơn" để gọi hàm từ `.bashrc` không? Ý tôi là, `export -f` vs `source ~/.bashrc` Cảm ơn
lá cờ tm
Phần "trả lại" phải đi trước nội dung bạn muốn trong trình bao tương tác, nhưng không muốn trong trình bao không tương tác.
lá cờ tm
Tôi không phải là chuyên gia nhưng tôi thích `nguồn` hơn `xuất`.
Jags avatar
lá cờ kp
Đó cũng là những gì tôi đã đọc ở một vài nơi rằng `nguồn` được ưu tiên/cách tốt hơn. Cảm ơn bạn rất nhiều :)

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.