Là mở rộng lịch sử bị vô hiệu hóa trong các kịch bản?


9

Tôi hiểu lỗi sau là do !được sử dụng để mở rộng lịch sử:

$ echo "Hello!Tim"
bash: !Tim: event not found

Tuy nhiên nếu tôi đặt lệnh vào tập lệnh và chạy tập lệnh thì không có vấn đề gì:

$ cat myscript
echo "Hello!Tim"
$ bash myscript 
Hello!Tim

Tại sao vậy? Có hướng dẫn bash đề cập đến lý do?


1
Câu hỏi hay, nói đơn giản. Làm rất tốt
tự đại diện

Dựa trên những gì tôi đang đọc ở đây: gnu.org/software/bash/manual/html_node/History-Interaction.html Tôi tin rằng bạn sẽ cần sử dụng một số loại shoptsửa đổi để làm cho nó hoạt động trong tập lệnh của mình. Tôi biết đó không thực sự là câu trả lời bạn đang tìm kiếm.
jesse_b

Trường hợp sử dụng là gì? Loại kịch bản nào bạn sẽ chạy sẽ mở rộng lịch sử trước đó của bạn? Hoặc nó sẽ mở rộng các lệnh trước đó từ kịch bản?
Jeff Schaller

@JeffSchaller, mở rộng lịch sử số trong một tập lệnh có số dương nghe có vẻ là một ý tưởng thực sự tồi tệ, nhưng tôi có thể dễ dàng tưởng tượng các trường hợp sử dụng cho !!hoặc !-2(số lịch sử âm / tương đối) hoặc tương tự. Hầu hết chúng sẽ được giải quyết tốt hơn theo những cách khác, nhưng vẫn là một câu hỏi hay về cách thức hoạt động của vỏ (và khi nào bạn không / không cần phải thoát khỏi dấu chấm than của mình!).
tự đại diện

Câu trả lời:


12

Có, mở rộng lịch sử được bật theo mặc định chỉ cho các vỏ tương tác.

Để kích hoạt nó cho một kịch bản shell, hãy viết:

set -H

Để vô hiệu hóa nó trong một vỏ tương tác, viết:

set +H

Để xác định xem hiện có mở rộng lịch sử hay không, hãy sử dụng một số dạng mã sau:

case $- in (*H*) echo enabled ;; (*) echo disabled ;; esac

Trong bắt đầu để dạy một lớp vỏ, tôi đào thông qua hướng dẫn rộng rãi để cố gắng thiết lập những gì một "shell tương tác" thực sự là. Đó là một câu hỏi xoáy, vì vậy hãy để tôi cứu bạn một số rắc rối:

Shell có NHIỀU tùy chọn. Một số tùy chọn này được khởi tạo theo các cách khác nhau khi shell có thiết bị đầu cuối điều khiển (hoặc khi bắt đầu với -i, blah blah, bất cứ điều gì, xem bên dưới).

TẤT CẢ các tùy chọn của shell có thể được thay đổi riêng lẻ.

"Vỏ tương tác" là một thuật ngữ lừa đảo khi bạn cố gắng xác định chính xác. Nó thực sự chỉ là một bộ sưu tập các cài đặt tùy chọn.

Câu hỏi về cài đặt nào làm cho vỏ tương tác hay không là không thể trả lời; nó trở nên lố bịch Nó chính xác là câu hỏi triết học tương tự như Con tàu của Theseus .

Nếu bạn bắt đầu một vỏ tương tác, nhưng sau đó vô hiệu hóa mở rộng lịch sử, sử dụng --noeditingcờ, đặt --norc, tắt expand_aliases, v.v., thì theo nghĩa nào là vỏ tương tác? Hoặc, khi nào nó trở nên không tương tác nữa? Bạn không thể trả lời những câu hỏi này.

Sự thật là "tương tác" chỉ là một nhãn thuận tiện cho một bộ sưu tập các tùy chọn vỏ khác nhau. Tương tự như vậy "không tương tác." Điều tương tự; chỉ là một tập hợp các hành vi mà mỗi người có thể được thay đổi riêng lẻ.

Điểm mấu chốt: shell hoạt động khác nhau khi nó được bắt đầu "tương tác" so với khi nó được bắt đầu "không tương tác". Cố gắng xác định chính xác các điều khoản này sau khi khởi động là ngớ ngẩn. Chỉ cần nhìn vào từng tùy chọn riêng biệt của vỏ để hiểu hành vi của nó.


Tôi đã quên rằng ngoài nghiên cứu của riêng tôi, tôi đã đăng tải về nó trên trang web này.


Cảm ơn. Trong hướng dẫn, tôi chỉ tìm thấy "Tùy chọn này được bật theo mặc định cho các vỏ tương tác" cho set -H. Có lẽ bạn suy luận rằng "mở rộng lịch sử được bật theo mặc định chỉ cho các vỏ tương tác".
Tim

@Tim, xem phần còn lại của câu trả lời của tôi. Câu đó của hướng dẫn sử dụng là một câu rất trơn, và cố gắng có được câu trả lời cho "cái vỏ tương tác là gì?" ra khỏi trang người đàn ông giống như nói chuyện trong vòng tròn. Nó không đi đến đâu.
tự đại diện

Điều bạn CÓ THỂ nói là đoạn mã sau sẽ luôn cho bạn biết liệu mở rộng lịch sử có được bật trong trình bao hiện tại hay không:case $- in (*H*) echo enabled ;; (*) echo disabled ;; esac
Wildcard

@Tim, nhân tiện, tôi không biết ý của bạn là "suy luận", vì đó là ý nghĩa rõ ràng của nó set -H. Đó là tùy chọn mở rộng.
tự đại diện

1
Tôi đã thử điều này trên một kịch bản và nó không hoạt động cho đến khi tôi cũng làm như vậy set -o history, sau khi xác minh với set -okịch bản rằng nó đã bị vô hiệu hóa.
Daniel C. Sobral
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.