Những gì đặt ra - Những gì làm trong điểm nhập Dockerfile này?


41

Tôi đang cố gắng hiểu điểm nhập Docker này làm gì .

Dường như với tôi đó là một mô hình rất phổ biến khi viết Dockerfiles, nhưng kỹ năng bash của tôi bị hạn chế và tôi không biết gì về tất cả các biểu tượng bash kung fu đặc biệt.

Ngoài ra, thật khó để google cho "-", "$!" vv Những gì được gọi là trong thế giới bash?

Tóm lại, dòng dưới đây đang cố gắng làm gì?

if [ "${1#-}" != "$1" ]; then
  set -- haproxy "$@"
fi

Câu trả lời:


55

Các setlệnh (khi không thiết lập tùy chọn) thiết lập các thông số vị trí như

$ set a b c
$ echo $1
a
$ echo $2
b
$ echo $3
c

Đây --là tiêu chuẩn "không coi bất cứ điều gì theo sau đây là một tùy chọn"

Tất "$@"cả các tham số vị trí hiện có.

Vì vậy, trình tự

set -- haproxy "$@"

Sẽ đặt từ haproxyở phía trước, $1 $2vv

ví dụ

$ echo $1,$2,$3
a,b,c
$ set -- haproxy "$@"
$ echo $1,$2,$3,$4   
haproxy,a,b,c

Tôi không thấy bất kỳ sự khác biệt bằng cách sử dụng "-" hay không. Đã thử ở đây và nhận được kết quả tương tự. Tôi thích nếu bạn có thể cải thiện câu trả lời để làm nổi bật sự khác biệt.
Lucas Pottersky

8
So sánh set -- -z 2 3 4set -z 2 3 4. Việc --dừng lại -ađược hiểu là một tùy chọn. Trong trường hợp này không cần thiết , nhưng đó là "thực hành tốt" để tập thói quen sử dụng --khi bạn lưu ý chắc chắn những gì sau đây :-)
Stephen Harris

1
Sự khác biệt chính khác là nếu bạn đang tìm nguồn cung cấp một tập lệnh bên trong tập lệnh khác, việc sử dụng set -- $arg1 $arg2sẽ cho phép tập lệnh có nguồn gốc của bạn đọc các đối số, nếu không, Bash chỉ hỗ trợ chuyển các đối số trực tiếp sang tập lệnh có nguồn gốc (và điều đó có thể gây chú ý).
dragon788
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.