Điểm:0

Mở tài liệu trong ứng dụng Xorg đã khởi chạy từ bash

lá cờ tn

Có cách nào để yêu cầu chương trình x đang chạy mở tệp từ bash không? (Tức là không gọi một phiên bản mới của chương trình). Trong khi tôi đang hỏi câu hỏi này trong bối cảnh xstata-mp, Tôi quan tâm nhiều hơn nếu loại giải pháp này tồn tại nói chung cho các ứng dụng Xorg.

Tôi có một ứng dụng x (xstata-mp, độc quyền, nổi bật đối với câu hỏi này khi bạn sẽ tìm hiểu) chạy sưng lên. Tôi đã quản lý để tạo một kịch bản khởi chạy đẹp mắt, trước tiên hãy kiểm tra xem xstata-mp đang chạy và nếu có, hãy đưa nó lên nền trước và nếu không thì khởi chạy nó. Nhiều như câu trả lời được chấp nhận cho câu hỏi này. Điều này rất quan trọng, vì ứng dụng được cài đặt như một phần của giấy phép trang web chỉ cho phép một số 'chỗ ngồi' đồng thời hạn chế (về mặt kỹ thuật, tôi chỉ được phép chạy nó một lần trên một máy).

Vấn đề của tôi là đôi khi tôi muốn mở một tài liệu được sử dụng bởi xstata-mp (ví dụ: một .dta tệp dữ liệu, một .làm tập tin kịch bản, một .sthlp tập tin trợ giúp, v.v.). Nếu tôi nhấp đúp vào biểu tượng của tệp đó hoặc chọn biểu tượng và nhấn <ENTER> trong khi xstata-mp đang chạy, tập lệnh khởi chạy sẽ được gọi (nó được tham chiếu trong giám đốc điều hành một phần của xstata-mp'S .desktop tập tin) và xstata-mp được nâng lên trên cùng của các cửa sổ có thể nhìn thấy nhưng không mở tài liệu.

Đối với những gì nó có giá trị, kiểm tra với pidof nó xuất hiện rằng xstata-mp không làm ra mắt một cái mới xstata-mp xử lý nếu tôi mở nhiều tài liệu trong đó (ví dụ: sử dụng <CTRL>-O); tương phản với, nói, firefox và nhiều tab/trang web.

Đây là tập lệnh khởi chạy mà tôi muốn sửa đổi:

# Kiểm tra xem xstata-mp v17 có chạy không
exit_code_pidof_xstata_mp=$(pidof /usr/local/stata17/xstata-mp)

# nếu xstata-mp v17 KHÔNG chạy, hãy khởi chạy nó với đối số $1
nếu [ -z "$exit_code_pidof_xstata_mp" ]
  sau đó
    /usr/local/stata17/xstata-mp -q $1; thoát >/dev/null
 # nhưng nếu xstata-mp v17 IS đang chạy, thay vào đó hãy đưa nó lên phía trước
 khác
  wmctrl -ia "$(wmctrl -lp | grep "$(pgrep /usr/local/stata17/xstata-mp)" | tail -1 | awk '{ print $1 }')"; thoát > /dev/null
  fi
Điểm:1
lá cờ in

First of all you should find out the correct command to open your document. So try to run the following command and see what you get.

/usr/local/stata17/xstata-mp --help

Of course this is the critical part. And here you rely solely on the functionality of your program. If it does not offer that option, well, then you cannot do it, because all a bash can ever do is start another program. From the 9.4 MB user manual with 399 pages I downloaded from StataCorp LLC, there was not a single hint on how to use xstata-mp.

Maybe the -q option is already what you want. But let's assume the right option to add another document to an already running instance of xstata-mp would be -a (like in VS Code: code -a). Then all you have to do, is to add the following line below your else statement:

/usr/local/stata17/xstata-mp -a "$1"

It would open your document and show the current window now.

Lexible avatar
lá cờ tn
Cảm ơn, đánh dấu. +1 Tôi thực sự đã đọc `xstata-mp --help` và cả những thứ không được ghi lại ở đó (như đối số `doedit`) trong tài liệu chính thức. Tôi sợ câu trả lời giống như câu trả lời của bạn có thể sắp xảy ra, nhưng đã đặt câu hỏi của mình với hy vọng rằng có thể có một số tiêu chuẩn giao diện cho các ứng dụng Xorg theo yêu cầu của tôi. (Nhân tiện, nếu có, đối số `-a` không phải là nó. ;). (Ngoài ra: tùy chọn `-q` hầu như không liên quan đến mối quan tâm của tôi ở đây.)
Lexible avatar
lá cờ tn
Này, đánh dấu. Tôi mới tìm hiểu và đang chơi với `xdotool`, cho phép một người thao tác (hành trình phím, văn bản, nhập con trỏ, cửa sổ, một số biến liên quan, v.v.) các chương trình Xorg. Khi tôi chỉnh sửa tập lệnh của mình để hoạt động, tôi sẽ soạn câu trả lời, nhưng muốn cho biết rằng có một giải pháp cho các ứng dụng Xorg nói chung! :)))
Lexible avatar
lá cờ tn
Ok, xem câu trả lời của tôi. :)
Điểm:0
lá cờ tn

CÓ: Có một cách để yêu cầu chương trình x đang chạy mở tệp từ bash!

Vì vậy, theo lời khuyên từ những người hỗ trợ kỹ thuật của StataCorp, hóa ra là xdotool (có thể được cài đặt với sudo apt cài đặt xdotool, nếu nó chưa có trên hệ thống của bạn) đưa ra giải pháp cho chính xác loại sự cố trong câu hỏi của tôi. Từ trang web của dự án:

xdotool cho phép bạn mô phỏng hoạt động của bàn phím và chuột, di chuyển và thay đổi kích thước cửa sổ, v.v.Nó thực hiện điều này bằng cách sử dụng tiện ích mở rộng XTEST của X11â và các chức năng Xlib khác.

â ï¸ Lưu ý: Nếu bạn đang sử dụng Wayland, vui lòng lưu ý rằng phần mềm này sẽ không hoạt động chính xác. â ï¸

Với xdotool, bạn có thể tìm kiếm các cửa sổ và di chuyển, thay đổi kích thước, ẩn và sửa đổi các thuộc tính của cửa sổ như tiêu đề. Nếu trình quản lý cửa sổ của bạn hỗ trợ nó, bạn có thể sử dụng xdotool để chuyển đổi màn hình nền, di chuyển cửa sổ giữa các màn hình nền và thay đổi số lượng màn hình nền.

Để giải quyết vấn đề của tôi với xdotool, tôi cần tạo một xdotool kịch bản mà tôi đang gọi statdoc.xdo:

#!/usr/bin/xdotool
tìm kiếm --name "Stata/MP"
gõ --window %1 '$1' '$2'
phím --window %1 Trả lại

Một vài nhận xét về kịch bản ngắn này:

  1. Đường dẫn có thể là một cái gì đó khác hơn là /usr/bin/xdotool, vì vậy hãy chắc chắn để xác nhận rằng với xdotool nào hoặc tương tự.
  2. Dòng thứ hai sẽ khớp một phần với tên "Thống kê/MP 17.0" với chuỗi được cung cấp ở trên. Điều này rất hữu ích, chẳng hạn như nâng cấp phiên bản lên 17.1 hoặc 18.x sẽ không làm hỏng tập lệnh. Các Tìm kiếm lệnh xác định cửa sổ ứng dụng X mà tôi muốn giao tiếp.
  3. xdotool tập lệnh chấp nhận đối số, sau đánh đập-Thích $1, $2, v.v. quy ước.
  4. Các loại lệnh gõ văn bản được cung cấp theo nghĩa đen—trong trường hợp của tôi, nội dung của hai văn bản được cung cấp $1$2 đối số chuỗi trong cửa sổ đầu tiên (và chỉ trong trường hợp của tôi) được xác định bởi Tìm kiếm lệnh ở dòng 2.
  5. Các Chìa khóa lệnh gửi một <ENTER> (hoặc <RETURN> nếu bạn thích) vào cùng một cửa sổ Stata.

Bây giờ, hãy xem tập lệnh khởi chạy đã sửa đổi của tôi, tập lệnh này gọi statdoc.xdo ở dòng thứ ba đến dòng cuối cùng (Tôi đã thêm một phần ở phía trước để nhận biết xem đối số được cung cấp có chỉ ra các loại tệp Stata cụ thể hay không—các lệnh sử dụng khác nhau là cần thiết để xử lý từng lệnh một cách duyên dáng¦ ví dụ của tôi chưa hoàn chỉnh, nhưng đây là các loại tệp Tôi sử dụng trong phần lớn công việc của mình):

# Kiểm tra xem KHÔNG có đối số hay không. Nếu không, không làm gì cả.
nếu [ -z "$1" ]
  sau đó
    nghỉ
 # Nếu không, hãy đặt tiền tố thành giá trị mặc định, sau đó kiểm tra 
 # tên tệp kết thúc bằng .hlp, .sthlp, .ado, .do hay .gph
 khác
  tiền tố = "sử dụng"
  nếu [ ${1##*.} = "hlp" ] || [ ${1##*.} = "sthlp" ] || [ ${1##*.} = "ado" ] || [ ${1##*.} = "làm" ]
    sau đó
      # Nếu tên tệp KHÔNG kết thúc bằng một trong bốn tiền tố đó thì
      # đổi tiền tố thành "doedit" để Stata mở tài liệu bằng 
      # trình chỉnh sửa tập tin do.
      tiền tố="doedit"
    fi
  # Nếu tên tệp kết thúc bằng .gph, thì hãy thay đổi tiền tố thành "doedit" để 
  # Stata mở tài liệu bằng trình xem/chỉnh sửa biểu đồ.
  nếu [ ${1##*.} = "gph" ]
    sau đó
      tiền tố="đồ thị sử dụng"
    fi
  nghỉ
  fi

# Kiểm tra xem xstata-mp v17 có chạy không
exit_code_pidof_xstata_mp=$(pidof /usr/local/stata17/xstata-mp)

# nếu xstata-mp v17 KHÔNG chạy, hãy khởi chạy nó với đối số $1
nếu [ -z "$exit_code_pidof_xstata_mp" ]
  sau đó
    /usr/local/stata17/xstata-mp -q $1; thoát >/dev/null
 # nhưng nếu xstata-mp v17 IS đang chạy, thay vào đó hãy đưa nó lên phía trước
 khác
  # Đầu tiên, gọi statadoc.xdo với tiền tố là đối số đầu tiên, 
  # và đường dẫn tệp được cung cấp làm đối số thứ hai 
  /usr/share/stata17/bin/statadoc.xdo "$prefix" " $1"
  wmctrl -ia "$(wmctrl -lp | grep "$(pgrep /usr/local/stata17/xstata-mp)" | tail -1 | awk '{ print $1 }')"; thoát > /dev/null
  fi

Lưu ý: Đây là giải pháp cho Gnome chạy trên Xorg.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.