2009-02-06 41 views
5

Trong tập lệnh bash của tôi, tôi cần thay đổi thư mục hiện tại thành thư mục chính của người dùng.Thay đổi thư mục tập lệnh thành homedir của người dùng trong tập lệnh shell

nếu tôi muốn thay đổi để foo nhà dir của người dùng, từ dòng lệnh tôi có thể làm:

cd ~foo 

nào hoạt động tốt, tuy nhiên khi tôi làm như vậy từ kịch bản nó nói với tôi :

./bar.sh: line 4: cd: ~foo: No such file or directory 

Đường nối như vậy sẽ là một điều nhỏ nhặt nhưng không hoạt động. Có vấn đề gì ở đây? Tôi có cần phải thoát khỏi dấu ngoặc kép "~" hoặc có thể bị thiếu hoặc cái gì khác không?

Sửa

khi tôi nói dùng Tôi không có ý hiện tại người dùng chạy kịch bản, nhưng nhìn chung sử dụng bất kỳ khác trên hệ thống

Sửa

Đây là tập lệnh:

#!/bin/bash 

user="foo" 
cd ~$user 

nếu tên người dùng là hardcoded như

cd ~foo 

nó hoạt động, nhưng nếu nó là trong sử dụng biến sau đó nó không. Tôi đang thiếu gì ở đây?

+0

Bạn có muốn thư mục chính cho người dùng foo hoặc thư mục foo trong thư mục chính của người dùng không? –

+0

Tôi muốn thư mục chính của người dùng foo –

+0

Hình dạng của bạn trông như thế nào? –

Trả lời

15

gì về

cd $(getent passwd foo | cut -d: -f6) 

USER=foo 
eval cd ~$USER 

công trình, quá (foo là username)

+0

Cảm ơn! Cả hai phương pháp đều hiệu quả. _eval_ đã làm thủ thuật cho tôi. –

+0

đầu tiên (có lẽ ngay cả với backticks thay vì $()) là xách tay hơn vì không phải mọi vỏ hỗ trợ cd ~ USER. –

8

Thay đổi nó để:

cd $HOME 

Trên thực tế, tôi không chắc chắn lý do tại sao cd ~whatever sẽ không hoạt động. Tôi vừa thử nghiệm với một tập lệnh nhỏ và nó hoạt động tốt:

#!/bin/bash 

cd ~sbright 

Tôi thực sự nhận được thông báo lỗi tương tự mà bạn thực hiện khi người dùng được chỉ định không tồn tại trên hệ thống. Bạn có chắc chắn (và có, tôi biết đây là một trong những câu hỏi được cắm vào) mà người dùng tồn tại và có một thư mục chính hợp lệ được chỉ định?

Edit:

Bây giờ mà tôi nhìn thấy những gì bạn đang thực sự làm ... mở rộng dấu ngã xảy ra trước khi suy biến, đó là lý do tại sao bạn đang nhận được lỗi này.

+0

Khi tôi muốn nói _user_ Tôi không có nghĩa là người dùng hiện đang chạy tập lệnh, nhưng bất kỳ người dùng nào khác trên hệ thống –

+0

Bạn có thể đăng thêm tập lệnh của mình không? –

+0

Có người dùng tồn tại, tôi biết rằng chỉ đơn giản là vì cùng một điều chính xác hoạt động từ dòng lệnh –

-1

Có một số lý do bạn không thể làm:

#!/bin/bash 

cd /home/$USER 

Trong thư mục Tất nhiên không trong/home trên tất cả * nixes, nhưng giả sử bạn biết những gì OS/distro kịch bản của bạn đang nhắm mục tiêu cho bạn sẽ có thể đưa ra một cái gì đó hoạt động tốt đủ.

+0

Cảm ơn bạn đã trả lời nhanh nhưng điều này/home/$ USER chỉ đơn giản là sẽ không hoạt động do cấu hình của chúng tôi. Sử dụng "~" trong môi trường của tôi là cách khả thi duy nhất để tra cứu nhà của người dùng. –

+0

Nói chung, trong khi/home là đường dẫn thông thường đến thư mục chính, nó không được bảo đảm. Tôi có vẻ/u/home và/home/user [1-9]/và các sắp xếp khác. – dmckee

0

là kịch bản sẽ được điều hành bởi người sử dụng? Nếu bạn chỉ có thể thực hiện: cd ~

+0

Không không, tập lệnh được chạy bởi người dùng root và thực hiện các thao tác trên người dùng _other_. –

+0

Bash phải giải thích dấu ngã và biến theo cách nào đó mà chúng ta không mong đợi. Sau một chút dấu vết và lỗi này hoạt động: USER = ~ foo; cd $ USER; –

Các vấn đề liên quan