Chạy bash script khi đăng nhập được lưu trong thư mục nhà?


19

Khi tôi cố tải một bảng khởi chạy LaunchAgent từ launchctltôi không thể tìm ra cách chạy tập lệnh trong thư mục chính.

Mã của tôi là:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>ProgramArguments</key>
    <array>
        <string>bash</string>
        <string>~/script.sh</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>Label</key>
    <string>com.tyilo.test</string>
</dict>
</plist>

Tôi đã thử cả có và không có bash và cũng thay thế ~bằng $HOME. Tôi cũng đã thử sử dụng bash -cmà không làm việc.

Mã lỗi là:

`com.tyilo.test: bash: ~/script.sh: No such file or directory`

Hãy thử đặt đường dẫn đầy đủ, ví dụ: /Users/name/script.sh (Ngoài ra, tôi sẽ làm cho tập lệnh có thể thực thi được và với dòng đầu tiên #! / Bin / bash và chạy trực tiếp)
user151019

Tôi không thể sử dụng đường dẫn đầy đủ vì nó sẽ được sử dụng trên nhiều tài khoản và máy tính.
Tyilo

1
Nếu nó được sử dụng cho nhiều tài khoản của tôi thì bạn nên đặt nó vào / usr / local / bin / thay vì tạo nhiều bản sao của nó trong mỗi $ HOME của mỗi người dùng. Sẽ rất hữu ích khi biết những gì bạn đang cố gắng thực hiện với kịch bản này. Nghe có vẻ như một công việc cho Đăng nhập, IMO.
TJ Luoma

Câu trả lời:


14

EnableGlobbingcho phép mở rộng dấu ngã và ký tự đại diện cho ProgramArguments:

<key>EnableGlobbing</key>
<true/>
<key>ProgramArguments</key>
<array>
    <string>say</string>
    <string>~/*</string>
</array>

Nó không ảnh hưởng Programhoặc WatchPaths, tuy nhiên mở rộng dấu ngã hoạt động WatchPathstheo mặc định.


Đây là cách tốt hơn để làm điều này. Có nơi nào bạn có thể xem tài liệu cho các khóa trong bảng liệt kê LaunchAgent không?
Tyilo

người đàn ông launchd.plist. Hoặc xem bài đăng blog này hoặc trang web của tôi .
Lri

1
Điều này cũng giúp tôi. Đã thử trong các phiên bản Mac OS X sau: 10.7, 10.8 và 10.9.
Dj S

6
Xin lưu ý: Tính năng này đã bị xóa trong Yosemite ( Mac OS X 10.10+).
alex xám

Có vẻ như nó cũng không phải trong 10.9.5
ocodo

18

EnableGlobbing không hoạt động trên OS X Yosemite 10.10 . Nó đã bị phản đối ( ref ).

Bạn có thể thấy trong nhật ký The EnableGlobbing key is no longer respected. Please remove it.(từ /var/log/system.log)

Vấn đề là launchdcwd (thư mục làm việc hiện tại) /, vì vậy bạn không thể sử dụng ./như một số người đã nói.

Để chạy một kịch bản từ nhà của bạn, cách đơn giản là sử dụng (bash|zsh|sh) -c. Lựa chọn. Bằng cách này, bạn sẽ có khả năng sử dụng dấu ngã ~hoặc $HOMEbiến.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>org.your.stuff</string>
    <key>ProgramArguments</key>
    <array>
      <!-- here is the important thing -->
      <string>zsh</string>
      <string>-c</string>
      <string>~/you/script/in/your/home</string>
    </array>

    <!-- code below is just for the example -->
    <!-- Keep running... -->
    <key>KeepAlive</key>
    <true />
    <!-- ...every day. In sec, 60*60*24 = every day -->
    <key>ThrottleInterval</key>
    <integer>86400</integer>
  </dict>
</plist>

2
Tôi không nghĩ bạn có thể sử dụng dấu ngã với sh; khi Bash có liên quan sh, nó chạy trong chế độ tương thích POSIX, vô hiệu hóa nhiều phần mở rộng Bash.
tripleee

~/đang ngấu nghiến nên không được hỗ trợ. Bạn có thể sử dụng ./thay vì miễn là daemon được lưu trong thư viện nhà của người dùng. ( ~/Library/LaunchAgents)
Bruno

9

Điều đáng tin cậy nhất mà tôi tìm thấy khi làm điều này là bằng cách sử dụng shHOMEbiến môi trường:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>ProgramArguments</key>
    <array>
        <string>sh</string>
        <string>-c</string>
        <string>"$HOME/script.sh"</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>Label</key>
    <string>com.tyilo.test</string>
</dict>
</plist>

Lưu ý: các trích dẫn được yêu cầu.


2

Sẽ rất hữu ích khi biết lý do tại sao tập lệnh cần được chạy từ thư mục chính của người dùng. Nếu bạn cần tên viết tắt của người dùng cho tập lệnh, bạn có thể lấy nó bằng cách gán nó cho một biến như trong

user=`whoami`

Sau đó sử dụng $usertrong kịch bản.

Tôi thực sự sẽ đặt tập lệnh ở một nơi khác ngoài thư mục chính, sau đó người dùng khác có thể truy cập được trên cùng một máy tính. Bạn có thể sử dụng thư mục Dùng chung hoặc đặt tập lệnh vào / Thư viện / Tập lệnh /

Bạn sẽ phải sử dụng đường dẫn đầy đủ cho bảng khởi chạy. Ngoài ra, trong phần khởi động của bạn, bạn sẽ không cần chỉ định <string>bash</string>vì bạn nên có shebang trong tập lệnh và nó sẽ được thực thi.


Xác định bashlà lệnh thực sự để thực thi là một dự phòng tốt không có bất lợi thực sự. Nếu anh ta không có shebang hoặc quên làm cho tập lệnh thực thi (o = rwx), thì bash vẫn sẽ gọi / thực thi tập lệnh.
Jason Salaz

1
Đã có một biến cho tên người dùng, chẳng hạn như $ USER hoặc $ LOGNAME. Ngoài ra, vị trí thông thường cho các tập lệnh Unix được chia sẻ sẽ là / usr / local / bin / (không phải là bạn không thể đặt chúng ở nơi khác, nhưng / usr / local / bin / rất có thể đã có trong $ PATH của bạn).
TJ Luoma

Sử dụng whoami chỉ là một phương pháp khác để có được thông tin tương tự như $ USER hoặc $ LOGNAME. Tôi đề nghị các địa điểm trên vì tôi không muốn đoán bất cứ điều gì của người hỏi. Ngoài ra, trước khi cố gắng làm cho trình khởi chạy plist hoạt động, tập lệnh thực sự cần có khả năng chạy từ CLI.
afragen

1

Có thực thi được không?

chmod 700 ~/script.sh

trong Terminal. Ngoài ra, tôi sẽ không sử dụng $ HOME hoặc ~ mà là đường dẫn thực tế đến tệp.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.tyilo.test</string>
    <key>ProgramArguments</key>
    <array>
        <string>/path/to/script.sh</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>

Lý do của downvote là gì?
TJ Luoma

1

Nếu tập lệnh của bạn là tác nhân người dùng (và do đó nằm trong thư viện của thư mục Home), thư mục launchdlàm việc hiện tại là thư mục Home. UNIX đề cập đến thư mục nhà với một khoảng thời gian trong đường dẫn.

Vì vậy, về cơ bản, sử dụng ./script.shthay vì ~/script.sh. ;-)


3
Không, thư mục làm việc của launchd thực sự /, không phải '~'.
Tyilo

@Tyilo Tôi không chắc ý của bạn là gì. Nếu bạn có nghĩa là "thư mục làm việc của launchd là root, trong mọi trường hợp, ngay cả trong chế độ người dùng", vui lòng cung cấp một tài liệu tham khảo. Nếu bạn có nghĩa là "launchd sử dụng dấu gạch chéo thay vì dấu ngã", hãy đọc lại bài viết của tôi. Nhân tiện, tôi có một số kịch bản được lên lịch trong launchd và chúng tuân theo hành vi mà tôi mô tả. ;-)
Constantino Tsarouhas

1
@RandyMarch tôi đã thực hiện một tác nhân ra mắt ở ~/Library/LaunchAgentsvới các đối số: sh, -c, echo $HOME > /Users/Tyilo/launchd_home.txt. Khi chạy tập tin /Users/Tyilo/launchd_home.txtchứa /, không /Users/Tyilo.
Tyilo
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.