Thực thi lệnh mà không giữ nó trong lịch sử [đóng]


203

Tôi muốn thực thi một số lệnh nhưng không muốn lưu trữ chúng trong lịch sử lệnh. Vì vậy, không ai có thể tìm kiếm nó trong .bash_historytập tin.

Có cách nào để thực hiện các lệnh bash theo cách này không?


13
Câu hỏi này có lẽ nên được chuyển đến ServerFault vì đây không phải là "lập trình" nhiều như "quản trị viên máy chủ" - nhưng cảm ơn vì câu hỏi / câu trả lời, chính xác là những gì tôi cần!
Andrew Theken

Câu trả lời:


294

Bắt đầu lệnh của bạn với một khoảng trắng và nó sẽ không được đưa vào lịch sử.

Xin lưu ý rằng điều này không yêu cầu biến môi trường $HISTCONTROLđược đặt.

  • Kiểm tra xem lệnh sau trả về ignorespacehay ignoreboth

    #> echo $HISTCONTROL
  • Để thêm biến môi trường nếu thiếu, dòng sau có thể được thêm vào hồ sơ bash. Ví dụ%HOME/.bashrc

    export HISTCONTROL=ignorespace

Sau khi tìm nguồn cung cấp hồ sơ, các lệnh tiền tố không gian sẽ không được ghi vào $HISTFILE


20
Điều này không hoạt động trừ khi không có khoảng trống được bao gồm trong $ HISTCONTROL - mặc dù đây có thể là mặc định trên hầu hết các hệ thống.
pgl

2
Chính xác. Để biết thêm chi tiết, OP nên xem HISTCONTROL và HISTIGNORE trong trang bash man.
u-punkt

2
thegeek ware.com / 2008/08 / từ - nhiều mẹo lịch sử bash có sẵn ở đây bao gồm phương pháp ẩn lệnh này từ lịch sử
user379997

52

Trong bất kỳ phiên Bash nào, hãy đặt tệp lịch sử thành / dev / null bằng cách nhập:

export HISTFILE=/dev/null

Lưu ý rằng, như đã chỉ ra trong các bình luận, điều này sẽ không ghi bất kỳ lệnh nào trong phiên đó vào lịch sử!

Vui lòng không làm phiền với công việc khó khăn của quản trị viên hệ thống của bạn;)

Giải pháp của Doodad thanh lịch hơn. Đơn giản chỉ cần bỏ đặt biến: unset HISTFILE(cảm ơn!)


5
Điều này sẽ ngăn tất cả các lệnh được đăng nhập. Đó không phải là những gì người hỏi muốn.
Noufal Ibrahim

12
Điều này gây ra sự cố cho tôi liên quan đến /dev/nullquyền được đặt thành 0600 khi đăng xuất. Thay vào đó tôi đã sử dụng unset HISTFILE.
Doodad


21

Phần mở rộng câu trả lời của @John Doe & @ user3270492. Nhưng, điều này dường như làm việc cho tôi.

<your_secret_command>; history -d $((HISTCMD-1))

Bạn không nên thấy mục nhập của lệnh trong lịch sử của bạn.

Đây là lời giải thích ..

'Lịch sử -d' xóa mục được đề cập khỏi lịch sử.

HISTCMD lưu trữ Command_number của lệnh sẽ được thực thi tiếp theo. Vì vậy, (HISTCMD-1) đề cập đến lệnh được thực hiện cuối cùng.

Xóa một dòng nhất định khỏi tệp lịch sử Bash


Thật không may, điều này đã không làm việc cho tôi.
Magick

10

Bạn có thể cân nhắc sử dụng shell mà không có lịch sử, như có lẽ

/bin/sh << END
   your commands without history
END

(có lẽ /bin/dashhoặc /bin/sashcó thể phù hợp hơn /bin/sh)

hoặc thậm chí tốt hơn sử dụng các tiện ích hàng loạt, ví dụ

batch << EOB
   your commands
EOB

Lịch sử sau đó sẽ chứa shhoặc batchkhông có ý nghĩa


8

Bạn có thể bắt đầu phiên của bạn với

export HISTFILE=/dev/null ;history -d $(history 1)

sau đó tiến hành với việc làm lén lút của bạn. Đặt histfile thành /dev/nullsẽ được ghi vào tệp lịch sử, tuy nhiên mục này sẽ dễ dàng bị xóa và không có dấu vết (ít nhất là trong tệp lịch sử) sẽ được hiển thị.

Ngoài ra, điều này là không vĩnh viễn.


Điều này đã được trả lời nhiều lần. Bạn sẽ nói gì câu trả lời của bạn thêm vào chủ đề này (ngoại trừ tiếng ồn vô dụng)?
gniourf_gniourf

Nó không được đặt cùng một câu trả lời , để không có lệnh nào xuất hiện trong lịch sử không có bất cứ điều gì xuất hiện sau đó.
Christian

1
Nhưng bây giờ chủ đề này là một mớ hỗn độn thực sự! trong trường hợp này, đặc biệt là đối với một câu hỏi cũ như vậy, tôi tin rằng tốt hơn là bạn chỉnh sửa các câu trả lời tốt đã có và / hoặc để lại một bình luận
CÂU

5

Như Doodad đã đề cập trong các bình luận , unset HISTFILEđiều này rất hay, nhưng trong trường hợp bạn cũng muốn xóa một số lịch sử, hãy làm echo $HISTFILEđể lấy vị trí tệp lịch sử (thông thường ~/.bash_history) unset HISTFILE, và chỉnh sửa ~/.bash_history(hoặc bất cứ điều gì HISTFILE- tất nhiên là bây giờ unsetđể bạn có thể ' t đọc nó).

$ echo $HISTFILE       # E.g. ~/.bash_history
$ unset HISTFILE
$ vi ~/.bash_history   # Or your preferred editor

Sau đó, bạn đã chỉnh sửa lịch sử của mình và thực tế là bạn đã chỉnh sửa nó!


Đã thử điều này trên: GNU bash, phiên bản 3.2.57 (1) -release (x86_64-apple-darwin15) và nó không hoạt động. Các lệnh tôi đã sử dụng sau khi bỏ đặt LỊCH SỬ được lưu trữ trong ~ / .bash_history
Krystian

@Krystian Sai lầm của tôi - Tôi đã viết "unset HISTORY" khi nó phải là "unset HISTFILE" - đã sửa. Nó có hoạt động bây giờ không? Nó hoạt động trên GNU bash, phiên bản 4.3.30 (1) -release (x86_64-pc-linux-gnu).
drkvogel

tôi cũng không chắc Kiểm tra đơn giản: unset HISTFILE; echo TEST; historysẽ cung cấp cho bạn lệnh echo TESTnhư trước để cuối cùng. Mặc dù sau khi kết thúc phiên và kết nối lại, lịch sử không có mục này thực sự. Vì vậy, tôi sẽ nói rằng nó hoạt động :)
Krystian

unset HISTFILEdường như không dừng các lệnh được ghi lại trong lịch sử trong bộ nhớ, nhưng nó ngăn chúng được ghi lại trong bất kỳ tệp nào $ HISTFILE. Vì vậy, tôi đoán bạn vẫn còn lịch sử cục bộ trong bộ nhớ, nhưng nó không được ghi lại trong một tệp nữa, đó là những gì bạn có thể muốn! ;)
drkvogel

4

Bạn cũng có thể sử dụng lệnh sau:

echo toto; history -d $(history | sed -n '$s/\s*\([0-9]*\)\s*.*$/\1/p')

Tôi nghĩ rằng đó là một lệnh rất di động.


Tôi đã tạo bí danh từ đây: alias forget="history -d $(history | sed -n '$s/\s*\([0-9]*\)\s*.*$/\1/p')"và bây giờ Bạn có thể làm điều đó như thế này:mysql -uroot -pSecretPassword ; forget
sobi3ch

1
Xin lỗi, nhưng tôi nhận ra Bạn cần tạo chức năng thay vì bí danh vì dấu ngoặc kép thay đổi ý nghĩa $svà những thứ khác trong sed. function forget() { // put code here // }
sobi3ch

3

Nếu bạn đang sử dụng zsh, bạn có thể chạy:

setopt histignorespace

Sau khi được đặt, mỗi lệnh bắt đầu bằng khoảng trắng sẽ bị loại khỏi lịch sử.

Bạn có thể sử dụng bí danh trong .zshrcđể tắt chức năng này on / off :

# Toggle ignore-space. Useful when entering passwords.
alias history-ignore-space-on='\
setopt hist_ignore_space;\
echo "Commands starting with space are now EXCLUDED from history."'

alias history-ignore-space-off='\
unsetopt hist_ignore_space;\
echo "Commands starting with space are now ADDED to history."'

Đẹp, nhưng câu hỏi này được gắn thẻ bash
tripleee

2

Có một số cách bạn có thể đạt được điều này. Điều này đặt kích thước của tệp lịch sử thành 0:

export HISTFILESIZE=0

Điều này đặt tệp lịch sử thành /dev/null, vô hiệu hóa nó:

export HISTFILE=/dev/null

Đối với các lệnh riêng lẻ, bạn có thể tiền tố lệnh với khoảng trắng và nó sẽ không được lưu trong tệp lịch sử. Lưu ý rằng điều này đòi hỏi bạn phải có ignorespacegiá trị được bao gồm trong $HISTCONTROLbiến môi trường (man bash và tìm kiếm ignorespaceđể biết thêm chi tiết).


2
Điều này sẽ ngăn tất cả các lệnh được đăng nhập. Đó không phải là những gì người hỏi muốn.
Noufal Ibrahim

Chà, tôi giả định rằng người hỏi sẽ đặt lại các giá trị sau khi làm bất cứ điều gì anh ta muốn mà không nên đăng nhập.
pgl

1

Điều này rất hữu ích nếu bạn muốn xóa tất cả lịch sử, bao gồm cả việc bạn đã xóa tất cả lịch sử!

rm .bash_history;export HISTFILE=/dev/null;exit

0

Bạn chỉ cần chạy:
$ set +o history

Để xem thêm, hãy chạy:
$ man set


2
Điều này vô hiệu hóa lịch sử cho tất cả các lệnh trong tương lai, không phải cho một lệnh riêng lẻ. Thay vào đó, hầu hết những người đến đây nên nhìn vào câu trả lời được chấp nhận.
tripleee

Điều này là hợp lệ, hoặc ổn nhưng không đầy đủ. Miễn là chúng ta thêm lệnh đảo ngược set -x historysau đó, nó hoạt động.
Abdillah

0

Lệnh này có thể có ích. Điều này sẽ không ghi lại lệnh được thực thi

history -d $((HISTCMD-1)) && <Your Command Here>
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.