我想知道Linux是否关注某个应用程序。说它是谷歌浏览器。为此,我编写了一个bash在线衬垫,可以正确执行此操作。
SELECT SUM(trans_value) total, bectrn_id, becat_id
FROM brvo_bemrc_transactions
WHERE year = p_year
AND trn_type = p_trntype
AND doc_type = p_doctype
AND company = p_company
AND bedfn_id = p_bedfn_id
AND bectrn_id = v_bectrn_id
AND becat_id = v_becat_id
AND CASE
WHEN (extract(month FROM SYSDATE) IN (1, 2, 3)) THEN
to_date(last_update_date) >= to_date(concat('01-OCT-', p_year - 1)) AND
to_date(last_update_date) <= to_date(concat('31-DEC-', p_year - 1))
WHEN (extract(month FROM SYSDATE) IN (4, 5, 6)) THEN
to_date(last_update_date) >= to_date(concat('01-JAN-', p_year - 1)) AND
to_date(last_update_date) <= to_date(concat('31-MAR-', p_year - 1))
WHEN (extract(month FROM SYSDATE) IN (7, 8, 9)) THEN
to_date(last_update_date) >= to_date(concat('01-APR-', p_year - 1)) AND
to_date(last_update_date) <= to_date(concat('30-JUN-', p_year - 1))
WHEN (extract(month FROM SYSDATE) IN (10, 11, 12)) THEN
to_date(last_update_date) >= to_date(concat('01-JUL-', p_year - 1)) AND
to_date(last_update_date) <= to_date(concat('30-SEP-', p_year - 1))
END
GROUP BY bectrn_id, becat_id;
在终端中运行此命令时,它将打印终端本身的ID。为避免这种情况,请运行以下命令并在三秒钟的时间范围内选择Chrome。
xdotool search --name --class 'google-chrome' | grep $(xdotool getactivewindow)
问题是,当我从Java运行上述单行代码时,它似乎总是不打印任何内容。这是我的代码:
sleep 3; xdotool search --name --class 'google-chrome' | grep $(xdotool getactivewindow)
我愿意采用不同的解决方案来解决此问题。
答案 0 :(得分:1)
如果您正在使用管道重定向,那么您要么必须调用Shell,要么自己将输出从一个程序重定向到另一个程序。
但是,恕我直言,您根本不需要grep
,只需:
示例(q&d,省略了资源/错误处理):
private static List<String> exec(String... args) throws IOException {
List<String> result = new ArrayList<>();
String line;
BufferedReader reader = new BufferedReader(
new InputStreamReader(
new ProcessBuilder()
.command(args)
.start()
.getInputStream()));
while ((line = reader.readLine()) != null) {
result.add(line);
}
return result;
}
public static void main(String[] args) {
try {
Thread.sleep(3000);
String windowId = exec("xdotool", "getactivewindow").get(0);
System.out.println(windowId);
List<String> windowList = exec("xdotool", "search", "--name", "--class", "google-chrome");
System.out.println(windowList.contains(windowId));
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
答案 1 :(得分:1)
正如barti_ddu所说,由于命令中的管道,此方法不起作用。您可以通过使用作为参数传递的命令创建一个sh进程来解决此问题:
String cmd = "xdotool search --name --class 'google-chrome' | grep $(xdotool getactivewindow)";
Process p = new ProcessBuilder("sh", "-c", cmd).start();
String result = getCommandResult(p.getInputStream());
答案 2 :(得分:0)
为什么要将该命令硬编码到类中?而是将命令放入外壳脚本中,然后调用它。然后,您可以灵活地更改命令而无需重新编译。
def course():
dept = input("Enter Course Dept: ")
number = input("Enter Course Code: ")
row = data[(data['Department']==dept.upper()) & (data['Course_number']==number)]
op=row.Pre_Requisites.values
str_join = "".join(op)
display(HTML(row.to_html()))
if 'None' in str_join:
print("No pre-req for this course!")
else:
r = replace_all(str_join, ["and", "or", "(", ")"], ",")
string= [part.split() for part in r.split(",") if part.strip()]
#print(string)
for item in string:
if item[0] == 'C':
continue
if item[0] == 'ENVE':
print(item[0],item[1])
continue
if item[0] == 'CE':
continue
display(HTML(data[(data["Department"] == item[0]) & (data["Course_number"] == item[1])].to_html()))
...根据您的应用程序,最好将shell脚本作为参数传递。
Process proc = Runtime.getRuntime().exec("./opt/scripts/myscript.sh");
编辑:
如果您的目标是弄清楚当前聚焦于哪个窗口,则可以尝试使用JNA(Java Native Access)库来执行此操作,而不是尝试通过命令行执行某些操作。