从 tcsh,如果我尝试:
exec /home/path/to/my/zsh
Run Code Online (Sandbox Code Playgroud)
它有效(我输入了 Zsh shell)
但如果我尝试
exec -c /home/path/to/my/zsh
Run Code Online (Sandbox Code Playgroud)
我得到:
-c Command not found
Run Code Online (Sandbox Code Playgroud)
如何切换到我的 Zsh shell 并从“空白石板”启动它?(即没有从 结转的环境变量tcsh)。
我想使用 find 命令搜索一个目录中的所有文件:
find . * -exec ll {} \;
结果显示每个文件有四个 (!) 结果:
file123./test/file123file123test/file123是否可以./test/file123使用 find-out-of-the-box-command仅显示第二个结果(因此不使用诸如 之类的东西| grep '^\./')?
我正在使用最新版本的 HP/UX。
我正在尝试在我的 64 位 Ubuntu 上运行交叉编译器。并导致以下错误:
$ ./arm-none-eabi-gcc
bash: ./arm-none-eabi-gcc: No such file or directory
Run Code Online (Sandbox Code Playgroud)
该文件在这里并包含一些数据:
$ ls -la arm-none-eabi-gcc
-rwxr-xr-x 2 alan alan 776368 Sep 26 19:36 arm-none-eabi-gcc
$ head -n 1 arm-none-eabi-gcc
ELF?4?
4 (44?4? TT?T???|?
Run Code Online (Sandbox Code Playgroud)
ldd 显示不需要依赖项:
$ ldd arm-none-eabi-gcc
not a dynamic executable
Run Code Online (Sandbox Code Playgroud)
strace 也没有提供额外的信息:
$ strace ./arm-none-eabi-gcc
execve("./arm-none-eabi-gcc", ["./arm-none-eabi-gcc"], [/* 80 vars */]) = -1 ENOENT (No such file or directory)
write(2, "strace: exec: No such file or di"..., 40strace: exec: No such file …Run Code Online (Sandbox Code Playgroud) 在以下 C 程序中:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(void){
char *shell = getenv("SHELL");
execl(shell, NULL, NULL);
perror("execl() failed");
}
Run Code Online (Sandbox Code Playgroud)
当我运行上面的代码时,我发现自己在一个新的 shell 中。当我输入exit新的 shell 时,我发现自己又回到了旧的 shell 中。
不应该execl()用一个新的 shell 替换当前的 shell(而不是在旧的 shell 中生成一个新的 shell)?
(Linux 4.16)
在具有美元名称的 Maven 本地存储库目录中 - 未解析的属性?我已经概述了我是如何得到几十个文件名中带有美元符号的目录的。
我试图用以下命令摆脱这些:
find . -type d -name "*\$*" -exec rm -rf {} \;
Run Code Online (Sandbox Code Playgroud)
它为每个目录提供了一条错误消息。但是目录和它们的内容从来没有少过。
所以我重试了/tmp:
mkdir "\$adir"
find . -type d -name "*\$*" -exec rm -rf {} \;
Run Code Online (Sandbox Code Playgroud)
并再次出错
find: ./$adir: No such file or directory
Run Code Online (Sandbox Code Playgroud)
如何在没有这样警告的情况下删除文件?
这是一个简单的脚本,它卷曲https://unix.stackexchange.com/并将结果存储到一个数组中,它工作正常。
#!/usr/local/bin/bash
[ -f pgtoscrap ] && { rm pgtoscrap; };
curl -o pgtoscrap https://unix.stackexchange.com/;
declare -a arr;
fileName="pgtoscrap";
exec 10<&0
exec < $fileName
let count=0
while read LINE; do
arr[$count]=$LINE
((count++))
done
exec 0<10 10<&-
Run Code Online (Sandbox Code Playgroud)
但是,每次我运行这个脚本时;我收到错误的文件描述符的一些错误。
./shcrap
./shcrap: line 14: 10: No such file or directory
Run Code Online (Sandbox Code Playgroud)
我想我不太明白如何exec在循环中正确使用命令。有人可以解释一下吗?
-- 在mapfile为 Bash 4实现之后更新它变得更简单 --
#!/usr/local/bin/bash
## Pass a parameter as e.g. ./linkscrapping.bash https://unix.stackexchange.com/
mapfile -t arr < <(curl -s $1); ## Doing exec stuff with …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个 bash 行,它将查看当前文件夹中的所有子目录,并告诉我是否有不包含“.git”的子目录。伪:
for subdir in currentdir
if .git does not exist
print subdir
Run Code Online (Sandbox Code Playgroud)
这是我正在尝试的单行代码,它不起作用并且似乎打印了所有子目录:
find . -maxdepth 1 -type d -execdir $SHELL -c '[ ! -d ".git" ] && echo "not git repo:" {}' $SHELL -c '{}' ';'
Run Code Online (Sandbox Code Playgroud)
我找到了一些解决方案,可以让我打印所有具有 .git 的子目录,就像这个- 我正在尝试做相反的事情。
我究竟做错了什么?这可能吗?
我不是很熟悉exec。我正在运行一些测试和示例。我想将写入文件的命令传递给它。我期望该命令的运行方式exec就像直接在命令行上运行一样。这是我设置并尝试过的:
[kellyry@ch12ldvela00 ~]$ cat exec_test
ls
[kellyry@ch12ldvela00 ~]$ cat exec_test | exec
[kellyry@ch12ldvela00 ~]$ cat exec_test | xargs exec
xargs: exec: No such file or directory
[kellyry@ch12ldvela00 ~]$ exec ls
exec_test file2 file3
. . .
Run Code Online (Sandbox Code Playgroud)
这是最奇怪的部分。运行最后一行exec ls不会返回。那是终端挂起,我无法与其通信。我认为最后一个问题可能是 Mobaxterm 的问题,我用它来 ssh 到服务器。
这个问题与如何“正确地”从 shell 启动应用程序密切相关,但试图解决更具体的问题。如何从 shell 生成应用程序,从而使其成为另一个进程的子进程。这是我的意思,以两个图形为例:
systemd-+-acpid
|-bash---chromium-+-chrome-sandbox---chromium-+-chrome-sandbox---nacl_helper
| | `-chromium---5*[chromium-+-{Chrome_ChildIOT}]
| | |-{Compositor}]
| | |-{HTMLParserThrea}]
| | |-{OptimizingCompi}]
| | `-3*[{v8:SweeperThrea}]]
| |-chromium
| |-chromium-+-chromium
| | |-{Chrome_ChildIOT}
| | `-{Watchdog}
| |-{AudioThread}
| |-3*[{BrowserBlocking}]
| |-{BrowserWatchdog}
| |-5*[{CachePoolWorker}]
| |-{Chrome_CacheThr}
| |-{Chrome_DBThread}
| |-{Chrome_FileThre}
| |-{Chrome_FileUser}
| |-{Chrome_HistoryT}
| |-{Chrome_IOThread}
| |-{Chrome_ProcessL}
| |-{Chrome_SafeBrow}
| |-{CrShutdownDetec}
| |-{IndexedDB}
| |-{LevelDBEnv}
| |-{NSS SSL ThreadW}
| |-{NetworkChangeNo}
| |-2*[{Proxy resolver}]
| |-{WorkerPool/1201}
| |-{WorkerPool/2059}
| |-{WorkerPool/2579}
| …Run Code Online (Sandbox Code Playgroud) 我试图根据一些正则表达式压缩目录中的所有文件夹,所以我使用 grep 过滤掉输出,现在我需要使用 tar 和文件夹名称。
例如我想 .tar.gz 每个顶级目录到它自己的存档。目录名称必须以“web_”开头,不能以“.tar.gz”结尾。
如何将 grep 输出捕获到变量,使其看起来像这样:
find . -maxdepth 1 -mindepth 1 -type d -print | grep -v \.tar\.gz$ | grep ^\./web_ | exec tar -czf $name.tar.gz $name
Run Code Online (Sandbox Code Playgroud)
或使用 ls -h
ls -h | grep -v \.tar\.gz$ | grep ^web_ | exec tar -czf $name.tar.gz $name
Run Code Online (Sandbox Code Playgroud)
选择“查找...”:
root@4a94aef49e3a:/home# find . -maxdepth 1 -mindepth 1 -type d -print | grep -v \.tar\.gz$ | grep ^web_
./web_demozip1
./web_demozip2
Run Code Online (Sandbox Code Playgroud)
选择“ls -h”:
root@4a94aef49e3a:/home# ls -h | grep -v \.tar\.gz$ …Run Code Online (Sandbox Code Playgroud) 两者exec都env不要 fork,请参阅以下示例:
docker run --rm -it ubuntu:18.04 sh -c 'exec sleep 1 & ps -Ho pid,ppid,cmd'
Run Code Online (Sandbox Code Playgroud)
PID PPID CMD
1 0 sh -c exec sleep 1 & ps -Ho pid,ppid,cmd
7 1 sleep 1
8 1 ps -Ho pid,ppid,cmd
Run Code Online (Sandbox Code Playgroud)
PID PPID CMD
1 0 sh -c exec sleep 1 & ps -Ho pid,ppid,cmd
7 1 sleep 1
8 1 ps -Ho pid,ppid,cmd
Run Code Online (Sandbox Code Playgroud)
PID PPID CMD
1 0 sh -c env sleep 1 & ps -Ho pid,ppid,cmd …Run Code Online (Sandbox Code Playgroud) 我们正在尝试捕获 exec 命令的返回代码,但是一旦执行该命令,脚本就会退出,而不会继续执行下一行。
exec /bin/sh -c $command > log.txt
rc=$?
if [ $rc -ne 0 ]; then echo "script failed"; exit 999 ; fi
Run Code Online (Sandbox Code Playgroud)
任何建议如何使“exec”命令执行,然后使下一组行继续
find . -name "*.mov" -exec bash -c 'ffmpeg -i "{}" -c:v libx264 -crf 20 -pix_fmt yuv420p "${0/.mov}.mp4"' {} \;
Run Code Online (Sandbox Code Playgroud)
当我手动运行它时,上面的命令可以完美运行,但我无法将它放在.bashrc文件中的函数中。接收unexpected end of line错误。
function fff { find . -name "*.mov" -exec bash -c 'ffmpeg -i "{}" -c:v libx264 -crf 20 -pix_fmt yuv420p "${0/.mov}.mp4"' {} \; }
Run Code Online (Sandbox Code Playgroud)