2009-09-06 10 views
18

Tôi muốn thay đổi mục tiêu của liên kết tượng trưng từ bên trong tập lệnh bash. Vấn đề là các liên kết tượng trưng là khá quan trọng (đó là /bin/sh, cụ thể là) và tôi sẽ làm điều đó trong thời trang đó:Thay thế liên kết tượng trưng quan trọng ‘an toàn’

  1. mục tiêu mới sẽ có mặt ngay sau khi loại bỏ cũ, tức là sẽ không có khả năng rằng một cái gì đó sẽ thông báo biến mất của nó,
  2. Sẽ không có khả năng thay đổi sẽ thất bại ở giữa, tức là để người dùng bị loại bỏ liên kết tượng trưng và không có biểu tượng mới.

Tôi đã nghĩ về hai phương pháp. Hoặc sử dụng đơn giản ln:

ln -fs /bin/bash /bin/sh 

hoặc sử dụng mv:

ln -s /bin/bash /bin/sh.new 
mv /bin/sh.new /bin/sh 

Cái nào sẽ phù hợp với nhu cầu của tôi tốt hơn? Có khả năng là một trong số họ sẽ cố gắng thay thế mục tiêu liên kết tượng trưng thay vì liên kết chính nó không?

Trả lời

22

Đổi tên (mv) là một hoạt động nguyên tử; tạo một liên kết mới không phải là (xóa liên kết tượng trưng cũ; tạo liên kết mới). Vì vậy, bạn nên sử dụng mv:

$ ln -s new current_tmp && mv -Tf current_tmp current 

Dưới đây là một blog post thảo luận này. Ngoài ra, nếu bạn đang lo lắng về những gì sẽ xảy ra, tại sao không thử nó trên một liên kết tượng trưng không quan trọng đầu tiên?

+1

Bạn không thể chắc chắn sẽ không có vấn đề gì nếu bạn chỉ thử :). Rất khó để thực hiện kiểm tra "thông báo một cái gì đó biến mất ". – Eugene

+1

Giới thiệu về bài đăng trên blog - '-T' dường như không phải là tùy chọn di động. –

-1

Có vẻ như (từ trang người đàn ông) ln -f bỏ liên kết tượng trưng trước khi tạo liên kết mới, nghĩa là mv là tùy chọn tốt hơn cho việc này.

Tuy nhiên, tôi khuyên bạn nên chống lại liên kết /bin/sh đến bash. Nhiều tập lệnh sử dụng:

#!/bin/sh 

và được viết giả định rằng vỏ là vỏ Bourne cổ điển. Nếu điều này là để chạy bash thay vào đó, bạn có thể dễ dàng nhận được sự không tương thích mơ hồ giữa những gì kịch bản giả định sh và những gì bashthực sự là. Đây sẽ là gần như không thể theo dõi.

+5

Ngoại trừ khóa học cho thực tế là trên nhiều hệ thống,/bin/sh * là * một liên kết tượng trưng đến/bin/bash; và khi được gọi thông qua nó, bash sẽ vào chế độ tương thích sh. –

+0

bash không thể tương thích. Hãy thử điều này trong một sh ​​thực sự và trong bash: i = 0; ls | trong khi đọc a; làm i = expr $ i + 1; làm xong ; echo $ i Nếu bạn làm không có sh thật, hãy thử với ksh Lưu ý rằng kết quả trên thậm chí khác nhau giữa các phiên bản sh. Trên solaris bản in cực kỳ cũ 0, trong khi phiên bản xpg4 cho số không (như ksh) – Gunstick

+1

@Gun: vì vậy, bạn lý do rằng vì "sh" không thể "sh" - tương thích ('s những gì bạn đang nói). .. yeah, chắc chắn, sau đó không có gì, bao gồm cả bash, có thể tương thích với tất cả các hành vi không xác định cũ "sh" s.Mặc dù, bash * có thể * tương thích với một số tiêu chuẩn sh được giả định/chấp nhận/được xác định. POSIX hoặc SUSv2 đến với tâm trí. –